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个字符)。
答案 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
。