如何解决字符串或二进制数据将在SQL Server存储过程中被截断

Bad*_*ker 1 sql sql-server stored-procedures

错误消息:

消息8152,级别16,状态14,过程IR_STK_VAL_FIFO,行74
字符串或二进制数据将被截断.

我正在运行并导致错误的查询:

EXEC [dbo].[IR_STK_VAL_FIFO] N'01-Jan-2012', N'25-May-2017', 0, '', 0, '', 0, '', 0, 0, '', N'S', N'05-Jul-2012', 0
Run Code Online (Sandbox Code Playgroud)

我有一个存储过程,我在这个表的最后一行大概收到错误:

CREATE TABLE #PAE_TR_ROWS
(  
     productId varchar(7),
     docType varchar(3),
     docId int,
     docDate SMALLDATETIME,
     qtyIn int,
     qtyOut int,
     rate decimal(12,4),
     sortOrder varchar(255),
     appRate decimal(12,4)
)
Run Code Online (Sandbox Code Playgroud)

插入上表:

INSERT INTO #PAE_TR_ROWS (productId, docType, docId, docDate, qtyIn, qtyOut, rate, sortOrder, appRate)
VALUES (@new_productId, @new_docType, @new_docId, @new_docDate, 0, @balanceQty, @new_rate, @new_sortOrder, @rate)
Run Code Online (Sandbox Code Playgroud)

Kob*_*uek 5

错误"字符串或二进制数据将被截断"意味着您尝试插入的数据大于您的某个列可以接受的数据.

发生这种情况是因为您传递给EXEC命令的值的顺序不正确.

例如,您传递的第一个值是此日期:

 EXEC [dbo].[IR_STK_VAL_FIFO] N'01-Jan-2012',N'25-May-2017',0...
                                    ?
Run Code Online (Sandbox Code Playgroud)

在命令中,它被声明为productId:

                             ?
INSERT INTO #PAE_TR_ROWS(productId,...
VALUES(@new_productId,...
            ?
Run Code Online (Sandbox Code Playgroud)

但是,该列productId只是varchar(7),因此该值01-Jan-2012超过了该大小.这就是你得到这个错误的原因.