【问题标题】:Are there any concerns moving from ntext to nvarchar(max)从 ntext 转移到 nvarchar(max) 是否有任何问题
【发布时间】:2026-01-26 04:45:01
【问题描述】:

是否担心将我的列类型从 text/ntext 更改为 varchar(max)/nvarchar(max)?

它会破坏任何东西吗?例如,具有 ntext 参数的 sprocs...

【问题讨论】:

  • 您的意思是不推荐使用 ntext 以外的其他内容?可能重复:*.com/questions/6975947/…
  • @RobertHarvey 我认为 OP 已经正确地从 NTEXT 移动到 NVARCHAR,但我想知道是否有任何破坏的危险。
  • 啊,是的,倒着读。 问题标题非常重要。
  • 最大的挑战可能是说服那些“一直这样做”并且认为没有理由改变的人。经过2年多的努力,我终于放弃了。神圣的奶牛死得很惨。

标签: sql-server database sql-server-2008


【解决方案1】:

有一些问题,例如,如果您当前正在使用以下功能:

您可能希望搜索您的代码库以识别这些 - 如果您使用 ad hoc SQL,则对您的应用程序和/或源代码控制进行 grep,或者使用以下命令搜索存储过程等:

SELECT OBJECT_SCHEMA_NAME([object_id]), OBJECT_NAME([object_id])
  FROM sys.sql_modules
  WHERE [definition] LIKE '%WRITETEXT%'
     OR [definition] LIKE '%READTEXT%'
     OR [definition] LIKE '%UPDATETEXT%'
     OR [definition] LIKE '%TEXTPTR%';

您还可以使用以下参数(我包括TEXTNTEXT)来识别过程和函数:

SELECT OBJECT_SCHEMA_NAME([object_id]), OBJECT_NAME([object_id]), name
  FROM sys.parameters
  WHERE system_type_id IN (35, 99);

以及使用这些列类型的表/视图/TVF:

SELECT OBJECT_SCHEMA_NAME([object_id]), OBJECT_NAME([object_id]), name
  FROM sys.columns
  WHERE system_type_id IN (35, 99);

或者 - 我不确定所有 API / 提供程序 - 但有些可能会遇到将 ntext 参数换成 nvarchar 的问题(并且您可能必须显式更改一些代码以指定-1)。自从我在这些类型仍然流行时(~1999 年)从事界面代码工作已经有很长时间了,所以如果我的记忆模糊不清,我深表歉意。

如果您的存储过程继续采用NTEXT 参数,您不应该进行任何重大更改,但您不希望长时间保持这种状态。

大多数情况下,您应该体验到更好的性能、更轻松的数据操作以及与新类型的整体改进兼容性。别介意面向未来!

【讨论】:

  • 关于视图,我需要改变还是应该改变?
  • @Fujiy,如果您要更改列以使用现代类型,则应使用 sp_refreshsqlmodule 更新引用这些表的所有视图。如果您在明确说CONVERT(NTEXT, whatever) 的视图中谈论输出列,那么以这种方式保留它们有什么好处?如果要更改数据类型,请更改数据类型。不要半途而废。
  • 我打算改变一切,但第一步是转换数据类型,所有应用程序都应该继续工作。我会小心为所有视图运行 sp_refreshsqlmodule