“SqlException:字符串或二进制数据将被截断。” - 是否有一种简单的方法来调试它?

时间:2013-06-20 17:53:30

标签: sql-server sql-server-2005

当执行产生此错误的存储过程时,可能会说错误在第42行附近。但错误远不及42.有时它在连接中,有时它在函数中,有时是子查询...但是第42行永远不会与错误相关甚至远程相关。

我通常要做的是复制所有存储过程代码,重新创建所有输入并设置默认值,然后开始将其分解并逐个重新执行以查找正在截断的数据位。当错误消失时,我知道在我删除的最后一批代码中出现了一些问题,因此我开始打破该批处理。这是一个痛苦,并且需要相当长的时间才能通过如此简单的修复来完成这样一个简单的错误。

是否有一种更简单的方法来调试我可能会丢失的内容?

1 个答案:

答案 0 :(得分:1)

您应该在存储过程中添加代码,以便在将值插入表之前检查变量的长度,并在必要时引发错误。 - 见下面的例子。

代码段

--This batch will fail with the SQL Server error message

 DECLARE @MyTable TABLE (MyID INT IDENTITY(1, 1), MyValue VARCHAR(10))

 DECLARE @MyParameter VARCHAR(100)

--Create a string of 52 chars in length

SET @MyParameter = REPLICATE('Z', 52)

INSERT INTO @MyTable(MyValue)

VALUES (@MyParameter)

GO

--This batch will fail with a custom error message

DECLARE @MyTable TABLE (MyID INT IDENTITY(1, 1), MyValue VARCHAR(10))

DECLARE @MyParameter VARCHAR(100)

--Create a string of 52 chars in length

SET @MyParameter = REPLICATE('Z', 52)

IF LEN(@MyParameter) > 10

BEGIN

RAISERROR('You attempted to insert too many characters into MyTable.MyValue.', 16, 1)

RETURN

END

ELSE

BEGIN

 INSERT INTO @MyTable(MyValue)

 VALUES (@MyParameter)

END

GO
相关问题