【发布时间】:2016-07-25 12:54:38
【问题描述】:
我在 SQL SERVER 2008 中有一个现有表,其中一列是 NVARCHAR(MAX),并且它的值少于 10 个字符。 此表正在生产中,其中包含数据。
我有一个要求,我必须将此列从 NVARCHAR(MAX) 更改为 NVARCHAR(50)。 TSQL Server 在执行此操作时会出现一些截断错误,即使该列中的数据少于 10 个字符。
这是我的脚本:
ALTER TABLE [dbo].[Table] ALTER COLUMN [Column1] NVARCHAR ( 50 ) NOT NULL
【问题讨论】:
-
exact 错误是什么?你确定数据真的少于10个字符吗?尝试查询行
WHERE LEN(Column1)>50。另请注意,NVARCHAR(MAX)是用于存储 blob 的类型,SQL Server 可能不允许更改类型。这就是为什么您应该发布完整的错误消息 -
"该列中的数据少于 10 个字符" - 你确定吗?很容易出现尾随空格。请运行 SELECT * FROM dbo.TABLE WHERE LEN(Column1) > 50。
-
还有,真的是错误,还是警告?
-
Hmmmmm - 添加到我上面的评论 - LEN 不计算尾随空格(根据 SQL 标准,令人惊讶的是微软这次遵守了),所以你必须使用 DATALENGTH 代替。由于是Unicode(NVARCHAR),每个字符是两个字节,所以检查
WHERE DATALENGTH(Column1) > 100 -
我 100% 确定列数据少于 10 个字符。但正如你所说的 LEN() 不计算空格,我需要重新检查。但无论如何,如果截断成功,不会有任何数据丢失。
标签: sql-server sql-server-2008