【发布时间】:2014-11-06 23:10:50
【问题描述】:
场景:一个大型存储过程每天运行数千次,每年每周运行 6 天。对于这种特定情况,我遇到了错误
消息 8152,第 16 层,第 14 州,第 114 行
字符串或二进制数据将被截断
这个存储过程大约有 800 行代码,有很多参数、很多变量和很多表。
Go
@exampleParam varchar(30)
@exampleParam datetime
DECLARE @declaredvara VARCHAR(50);
DECLARE @declaredvarb VARCHAR(50); -- where the line error is according to the printout
DECLARE @declaredvarc VARCHAR(50);
DECLARE @declaredvard VARCHAR(50); -- where line error is adjusted for comments in front of GO
BEGIN TRANS
-- some calculations (700+ lines)
COMMIT TRANS
--error catch
ROLLBACK TRANS
问题:我想知道是否可以读取准确的 Line 错误,因此我至少可以缩小我必须检查的表的范围。这个存储过程涉及大量的表。
*** 它所指向的两个声明变量(GO 调整前后)都是自重,它们是 nvr 使用的。
奖励信息:我运行存储过程时填充了参数和参数 = '',日期时间除外。在这两种情况下,我都遇到了同样的错误。但是,我知道存储过程可以正常工作,因为它每天被使用数千次而没有出现此错误。
EXEC SP '','','','','2014-11-6'
EXEC SP 'XX_XX_XX','',1,'','2014-11-6'
--both return the same error of Msg 8152, Level 16, State 14
--XX is a specific serialnum.
--However all other serialnum have no problem
编辑:数据库正在运行 SQL Server 2005 EDIT2:我正在使用 SQL Server 2008 进行编辑。 - 所以调试不是一种选择
【问题讨论】:
-
您是否将
@declaredvarb作为 varchar(50) 与其等效的 sql server 表进行了比较?您在某处将 1.) 超过 50 个字符放入变量中,2.) 列架构比您的数据更窄(字符串大于您的列)或 3. 将 Unicode 数据放入 varchar 字段中。 -
行号只会告诉你从批处理开始的行数,所以如果你有一个
GO(或者如果你重新定义了你的批处理分隔符),它就是从那里开始的行数。 -
双击 SSMS 中的错误消息,它应该可以了解错误行的位置。
-
@paqogomez 甚至没有使用行错误指向的变量。它刚刚声明,在评论它们时,会发生同样的错误。
-
@DavidG 我在 AlterProcedure 之前调整了 GO 的计数。无论哪种情况,它们都指向未使用的已声明变量。
标签: sql sql-server tsql stored-procedures