views:

4897

answers:

5

Hi, I've inherited a asp.net website project that currently runs MS SQL 2000 as its backend. I've been doing some databases changes on a local copy of the db using MS SQL Server 2005 Express. I've create a table using varchar(max) columns. They are used to stored snippets of XHTML that are of arbitrary length.

While browsing around on stackoverflow I came accross this: http://stackoverflow.com/questions/148398/are-there-any-disadvantages-to-always-using-nvarcharmax

User mattruma says he found out the "hard way" about using varchar(max) on sql 2000.

What should I use instead of varchar(max) given that the live database runs on MS SQL 2000?

Thanks in advance for any help!

+1  A: 

Use a TEXT column.

Otávio Décio
If you use a Text field, it would hamper possible searches on that field.
TheTXI
@TheTXI - there is nothing in the OP's question related to searching on that column.
Otávio Décio
+6  A: 

VARCHAR(Max) was introduced in SQL Server 2005, and will not work on SQL 2000. You need to use either VARCHAR(8000) assuming that will be big enough. Otherwise you will need to use TEXT

Edit

Also if you switch to VARCHAR(8000) keep in mind there is a limit that a single row cannot have more then 8060 Bytes. So if you fill up a varchar(8000) table and have a bunch of other large columns you will get an error. This is where Text comes in.

Text has performance implication because by default it is stored in a separate location, and they keep a pointer in a table. There is a set option which changes this behavior so that text types are kept in the table until they reach a certain size. If you have mostly small blobs you might want to enable this.

JoshBerke
We had to switch to VARCHAR(8000).
mattruma
A: 

You might be able to use text, the older BLOB datatype. The processing options are a lot more limited, hence the newer (max) types

However, there are lots of new code constructs and functions that you may have used that won't work either...

gbn
A: 

This depends on your needs. You can use a TEXT column instead of VARCHAR(MAX) but you have to be sure that your implementation doesn't need to search on that field, as you cannot do like comparisons on TEXT and NTEXT fields.

If you can limit yourself to 8000 characters, I would use a VARCHAR(8000) column to store the information.

Mitchel Sellers
nvarchar(4000) you mean? Or varchar(8000)?
gbn
good catch, I updated the response.
Mitchel Sellers
+3  A: 

It sounds like the varchar(MAX) limitations are a moot point if your live DB is SQL2000, which doesn't support them. If you have more than 8K characters to store you are pretty much left with the only other option, a TEXT column. However, beware that TEXT columns have a lot of limitations too.

For example you can't sort or group on them easily, nor can you compare them for equivalency with other columns. That is you can't say Select * from mytable where Mytext1=mytext2.

Other relevant concerns:
- I'd suggest using an NText or NVarchar field regardless of the way you go to support Unicode.
- If the table has a lot of other columns and the varchar(8000) field is likely to be frequently close to full, you may have problems with the row limit of 8K. Keep this in mind too.

JohnFx