0
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

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

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

消息 8152、级别 16、状态 13、过程 Proc_Name、第 57 行
字符串或二进制数据将被截断。

第 57 行SELECT是上述查询的语句所在的位置。任何人都知道为什么会发生这种情况?

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

4

3 回答 3

7

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

FRST_NAME
MDLE_NAME
LAST_NAME

添加最多超过 98 个字符(空格 +2)。

我建议声明@SF_TO为大于NVARCHAR(100)(但究竟是什么,我不知道)。

当然,错误消息很烦人。如果输出中包含更多细节,那就太好了。请对此 Connect 项目投票/评论

于 2013-03-27T17:48:03.337 回答
2

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

于 2013-03-27T17:48:58.263 回答
1

您收到此错误是因为以下连接:

TP.FRST_NAME + ' ' + TP.MDLE_NAME + ' ' + TP.LAST_NAME

大于100字符。现在,这可能并非在每一行上都是正确的,但在您选择的那一行上却是正确的。如果您运行此选择语句:

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.

于 2013-03-27T17:48:39.803 回答