3

尝试使用 UPDATE 命令为表上的字符串字段添加前缀。出于某种原因,我得到了

字符串或二进制数据将被截断。

例外,即使我的数据长度很容易适合该字段。

使用 SQL Server 2008 R2 标准版和 SSMS 2008 R2。

模板:Learner 是 nvarchar(60)

模板:Learner 是一个使用 60 个字节的 nvarchar(30),如 sp_help 中所示

select LEN('Aaaaaaaa' + LEFT(learner, 52)) myLen from Template order by myLen desc
>>> max len = 31

update Template set learner = 'Aaaaaaaa' + LEFT(learner, 52)
>>> String or binary data would be truncated.

update Template set learner = 'Aaaaaaaa' + LEFT(learner, 52)
>>> String or binary data would be truncated.

update Template set learner = CAST('Aaaaaaaa' + LEFT(learner, 52) AS NVARCHAR(60))
>>> String or binary data would be truncated.

而以下工作:

SELECT CAST('Aaaaaaaa' + LEFT(learner, 52) AS NVARCHAR(60)) FROM Template
4

3 回答 3

6

您可以尝试通过以下方式忽略此消息

SET ANSI_WARNINGS OFF
update ...
SET ANSI_WARNINGS ON
于 2012-10-10T21:26:14.623 回答
5

感谢您的回复。

看起来我被sp_helpsp_columns的长度值愚弄了。由于它是 NVARCHAR 列,因此长度是指以字节为单位的长度,而不是字符数。这是因为 NVARCHAR = Unicode (UTF-16) => 每个字符 2 个字节。

查看CREATE脚本揭示了真相。sp_columns 上的 PRECISION 字段也显示字符数。

于 2012-10-11T19:34:16.370 回答
0

我的问题是有另一个日志表(用于审计跟踪),由主表上的触发器填充,其中列大小也必须更改。

于 2014-07-03T10:21:50.507 回答