Answers:
优点是可以使用诸如LEN
and LEFT
on之类的函数,nvarchar(max)
而不能针对ntext
and进行此操作text
。它也nvarchar(max)
比text
您必须使用WRITETEXT
and的地方容易UPDATETEXT
。
此外,text
,ntext
等等,都被弃用(http://msdn.microsoft.com/en-us/library/ms187993.aspx)
nvarchar(max)
是您要使用的。最大的优点是您可以在此数据类型上使用所有T-SQL字符串函数。无法使用ntext
。我不知道任何真正的缺点。
nvarchar(max)
但是我最多只能输入4000个字符。如果我想要一个字段容纳更多的东西怎么办?
nvarchar(max)
字符数限制为4000个。因此,对于SQL Server Compact,我不得不ntext
在某些情况下使用。当他们停止使用它时,我想我将不必升级某些站点。
Text
(与NText
和一起使用Image
)的最大缺点是,如文档所述,它将在SQL Server的将来版本中删除。这将有效地使您的架构在发行该版本的SQL Server时更加难以升级。
希望增加我的转换经验。我text
在古代Linq2SQL代码中有很多领域。这是为了允许text
索引中存在的列在线重建。
首先,我已经知道了多年的好处,但始终认为转换将意味着一些可怕的长时间查询,在这些查询中SQL Server必须重建表并将所有内容复制过来,从而使我的网站瘫痪并提高了我的心跳。
我还担心如果Linq2SQL对列类型进行某种形式的验证,则可能导致错误。
值得高兴的是,ALTER命令立即返回了-因此,它们肯定只是在更改表元数据。可能会发生一些脱机工作,以将<8000个字符的数据恢复到表中,但ALTER命令是即时的。
我运行以下命令来查找所有需要转换的列:
SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] VARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'TEXT' order by table_name, column_name
SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] NVARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'NTEXT' order by table_name, column_name
这给了我一个不错的查询列表,我刚刚选择并复制到了一个新窗口。就像我说的-运行这是即时的。
Linq2SQL非常古老-它使用将表拖到其上的设计器。首先,对于EF Code而言,情况可能更为复杂,但我还没有解决。