从文本和图像迁移到 varchar(max) 和 varbinary(max)

Con*_*nce 8 database-design sql-server blob

我有一个包含许多SQL Server数据库imagetext列,我正在学习从他们迁移到其非过时的同行可能出现的潜在问题varbinary(max)varchar(max)

除了更改应用程序代码之外,我主要关注的是与此相关的潜在“陷阱”。例如,是否有旧数据类型支持但新数据类型不支持的功能?

至少由于截断造成的数据丢失似乎不是问题,因为新类型至少与旧类型一样大。

Aar*_*and 11

请注意:这些新数据类型支持与它们替换的已弃用类型相同的大小,例如 2GB 数据(这意味着不同数量的字符取决于 Unicode 和其他因素)。

可以肯定的一件事是,你应该分析现有的所有应用程序代码,存储过程,函数等,为内置插件一样的情况下UPDATETEXTREADTEXTTEXTPTRWRITETEXTTEXTSIZE@@TEXTSIZE-所有这些都将有可能被改变。您可以通过以下方式识别存储在 SQL Server 中的那些:

SELECT s.name, o.name
  FROM sys.sql_modules AS m
  INNER JOIN sys.objects AS o
  ON m.[object_id] = o.[object_id]
  INNER JOIN sys.schemas AS s
  ON o.[schema_id] = s.[schema_id]
  WHERE UPPER(m.definition) LIKE N'%UPDATETEXT%'
     OR UPPER(m.definition) LIKE N'%WRITETEXT%'
     OR UPPER(m.definition) LIKE N'%READTEXT%'
     OR UPPER(m.definition) LIKE N'%TEXTPTR%'
     OR UPPER(m.definition) LIKE N'%TEXTSIZE%';
Run Code Online (Sandbox Code Playgroud)

请注意,这可能会产生误报(例如,这些术语可能在注释中或自然出现在实体名称中),并且可能会遗漏一些(例如,可以使用参数/动态 SQL 构造命令)。您可以自行搜索应用程序代码库和/或源代码管理以查找相同的实例。

还要确保找到接受或输出这些类型参数的所有模块:

SELECT DISTINCT s.name, o.name
  FROM sys.parameters AS p
  INNER JOIN sys.objects AS o
  ON p.[object_id] = o.[object_id]
  INNER JOIN sys.schemas AS s
  ON o.[schema_id] = s.[schema_id]
  WHERE system_type_id IN (34,35,99);
Run Code Online (Sandbox Code Playgroud)

您可能还需要考虑,由于这些数据类型固有的限制,您可能在作业和其他维护例程中具有当前避免使用这些表或以不同方式对待它们的逻辑。当您转向较新的类型(尤其是在最新版本的 SQL Server 上)时,许多这些限制都会消失。

最后,除了上面的语法,我想不出旧类型支持新类型不支持的单一功能。