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

时间:2014-11-06 23:10:50

标签: sql sql-server tsql stored-procedures

场景:大型存储过程每天运行数千次,每周运行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进行编辑。 - 所以调试不是一个选项

4 个答案:

答案 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;进去。在这种情况下,将抛出类似的异常。有两种方法(据我所知)你可以找到错误的保证线:

  1. 如果您需要找到确切的错误发生线,您可能需要使用sql server调试工具调试SP(了解有关在Sql Server中调试的更多信息here
  2. 您还可以使用TRY ... CATCH块来检查SP中的哪个代码块导致错误。

答案 2 :(得分:3)

用于修复Msg 8152,Level 16,State 14,Line 114 字符串或二进制数据将被截断。

SET ansi_warnings OFF
GO

答案 3 :(得分:0)

事实证明该区域中的一个变量已被声明但从未给出值。

该变量后来被用作从内部执行另一个存储过程的参数。 这导致将一个空参数传递给一个无法包含它的参数。

感谢大家的回复。