场景:大型存储过程每天运行数千次,每周运行6天。对于这一个具体情况,我收到了错误
Msg 8152,Level 16,State 14,Line 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之前和之后)都指出它们是死重,它们是否被使用过。
奖励信息:我使用params填充存储过程,params =''除了日期时间。在这两种情况下我都得到了同样的错误。但是,我知道存储过程是有效的,因为它每天都会被使用数千次而没有出现此错误。
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进行编辑。 - 所以调试不是一个选项
答案 0 :(得分:4)
BEGIN CATCH
DECLARE @body VARCHAR(4000)
SET @body='<b>Exception in spname </b><br/>'
SET @body=@body + ( SELECT
'<b>Error No :</b> '+ CONVERT(VARCHAR(100),ERROR_NUMBER()) +'<br/>'
+'<b>Error Severity :</b> '+CONVERT(VARCHAR(1000),ERROR_SEVERITY()) +'<br/>'
+'<b>Error State :</b> '+CONVERT(VARCHAR(1000),ERROR_STATE()) + '<br/>'
+'<b>Error Procedure :</b> '+CONVERT(VARCHAR(1000),ERROR_PROCEDURE())+'<br/>'
+'<b>Error Line :</b> '+CONVERT(VARCHAR(100),ERROR_LINE())+'<br/>'
+'<b>Error Message :</b> '+CONVERT(VARCHAR(2000),ERROR_MESSAGE()));
END CATCH
答案 1 :(得分:3)
此错误表示您要存储更大的存储空间。您可能需要检查是否要在@declaredvara或@declaredvarb或@declaredvarc或@declaredvard或任何其他变量或表列中存储多于50个字符的字符串。例如,您可以将@test定义为varchar(2),然后尝试插入&#39; vahid&#39;进去。在这种情况下,将抛出类似的异常。有两种方法(据我所知)你可以找到错误的保证线:
答案 2 :(得分:3)
用于修复Msg 8152,Level 16,State 14,Line 114 字符串或二进制数据将被截断。
SET ansi_warnings OFF
GO
答案 3 :(得分:0)
事实证明该区域中的一个变量已被声明但从未给出值。
该变量后来被用作从内部执行另一个存储过程的参数。 这导致将一个空参数传递给一个无法包含它的参数。
感谢大家的回复。