解决'字符串或二进制数据将被截断'错误

时间:2013-03-27 17:40:51

标签: sql sql-server tsql stored-procedures

Declare @STAF_TO NVARCHAR(100)

我将以下查询作为SQL Server存储过程的一部分:

SELECT @SF_TO = TP.FRST_NAME + ' ' + TP.MDLE_NAME + ' ' + TP.LAST_NAME
FROM tbl_Sf TS 
INNER JOIN tbl_Pl TP ON (TS.POPL_PK = TP.POPL_PK)
WHERE TS.SF_PK = @ID

根据我在此之前插入的print语句,我知道@ID等于140(类型INT)。当我尝试单独执行此查询时,它工作正常。

但是,当我尝试将其作为存储过程的一部分运行时,我收到以下错误:

  

Msg 8152,Level 16,State 13,Procedure Proc_Name,Line 57
  字符串或二进制数据将被截断。

第57行是上面查询的SELECT语句。任何人都有任何想法为什么会发生这种情况?

编辑:我尝试将NVARCHAR(100)更改为NVARCHAR(200)NVARCHAR(MAX),但仍然出现错误。此外,如果我单独运行它,查询工作正常(100个字符)。

3 个答案:

答案 0 :(得分:7)

几乎可以肯定您的列的定义:

FRST_NAME
MDLE_NAME
LAST_NAME

最多可添加98个字符(空格为+2)。

我建议将@SF_TO声称为大于NVARCHAR(100)的东西(但确切地说,我不知道)。

肯定是错误消息令人烦恼。如果输出中包含更多细节,那将会很棒。 Please vote/comment on this Connect item

答案 1 :(得分:2)

连接语句几乎肯定会导致记录长度超过声明的@SF_TO长度。你应该增加@SF_To的长度。

答案 2 :(得分:1)

您收到此错误的原因是:

的串联
TP.FRST_NAME + ' ' + TP.MDLE_NAME + ' ' + TP.LAST_NAME

大于100个字符。现在,这可能不是每一行都是如此,但在您选择的那一行上确实如此。如果你运行了这个select语句:

SELECT TP.FRST_NAME + ' ' + TP.MDLE_NAME + ' ' + TP.LAST_NAME
FROM tbl_Sf TS 
INNER JOIN tbl_Pl TP ON (TS.POPL_PK = TP.POPL_PK)
WHERE LEN(TP.FRST_NAME + ' ' + TP.MDLE_NAME + ' ' + TP.LAST_NAME) > 100

您将能够找到有问题的行。另一种方法是简单地使@STAF_TO变量等于放在一起的那三列的长度+ 2.因此,如果列的定义中的所有50个字符都很长,@STAF_TO应该是152