字符串或二进制数据将被截断. - 即使长度短于场长

mot*_*tto 3 sql t-sql sql-server

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

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

异常,即使我的数据长度很容易适合该字段.

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

模板:学习者是nvarchar(60)

模板:学习者是一个nvarchar(30),使用60字节,如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.
Run Code Online (Sandbox Code Playgroud)

以下工作:

SELECT CAST('Aaaaaaaa' + LEFT(learner, 52) AS NVARCHAR(60)) FROM Template
Run Code Online (Sandbox Code Playgroud)

ale*_*lex 5

您可以尝试忽略此消息

SET ANSI_WARNINGS OFF
update ...
SET ANSI_WARNINGS ON
Run Code Online (Sandbox Code Playgroud)

  • 忽略消息而不理解为什么会发生这种消息总是一个非常糟糕的主意. (10认同)
  • 我同意,但这个表明数据丢失,因此不是"次要的".再说一遍:先了解 - 然后再决定. (4认同)

mot*_*tto 5

感谢您的回复。

看起来我对sp_helpsp_columns的长度值感到迷惑。因为它是NVARCHAR列,所以长度是指以字节为单位的长度,而不是字符数。这是因为NVARCHAR = Unicode(UTF-16)=>每个字符2个字节。

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