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

问题描述 投票:0回答:2

错误信息:

消息 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

我有一个存储过程,其中大约在此表的最后一行出现错误:

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)
)

在上表中插入:

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)
sql sql-server stored-procedures
2个回答
5
投票

错误“字符串或二进制数据将被截断”意味着您正在尝试插入大于某一列可以接受的数据。

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

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

EXEC [dbo].[IR_STK_VAL_FIFO] N'01-Jan-2012',N'25-May-2017',0... ▲

并且在命令中,它被声明为

productId

:

▼ INSERT INTO #PAE_TR_ROWS(productId,... VALUES(@new_productId,... ▲

但是,列

productId

 只有 
varchar(7)
,因此值 
01-Jan-2012
 超出了该大小。这就是您收到此错误的原因。


0
投票
我遇到了同样的问题,并且错误:

字符串或二进制数据将被截断。意味着,在您尝试插入数据的表中,您的列之一(在本例中类型为varchar)有在我的例子中,我使用的是默认长度,它是 255 个字符,因此该列的 max_length 小于 对象上的 字符 您试图为 此字段保存,例如:

@Entity public class Person { private String name; private String address; }
上面定义的字段

将在表中具有默认的字符大小,即255,如果某个特定人员的地址超过此 max_length,则会发生此错误。

© www.soinside.com 2019 - 2024. All rights reserved.