首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Msg 8152、级别16、状态14、XXX行字符串或二进制数据将被截断。

Msg 8152、级别16、状态14、XXX行字符串或二进制数据将被截断。
EN

Stack Overflow用户
提问于 2014-11-06 23:10:50
回答 5查看 73.9K关注 0票数 3

场景:大型存储过程每天运行数千次,每年每周运行6天。对于这个特定的情况,我得到了一个错误

Msg 8152,16级,14级,114线 字符串或二进制数据将被截断。

这个存储过程大约有800行代码,包含大量的参数、变量和表。

代码语言:javascript
复制
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

问题:我想知道是否有可能得到一个准确的行错误读取,这样我至少可以缩小我必须检查的表。这个存储过程涉及大量的表。

*这两个已声明的变量(GO调整前后)都指向死重,它们都使用nvr。

额外信息:我运行存储过程时填充了params和params = '‘,除了日期时间之外。在这两种情况下,我都得到了相同的错误。但是,我知道存储过程是有效的,因为它每天被使用数千次,以避免这个错误。

代码语言:javascript
复制
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

编辑:数据库正在运行Server 2005 EDIT2:我正在使用Server 2008进行编辑。-所以调试不是一个选项

EN

回答 5

Stack Overflow用户

发布于 2018-03-17 03:00:29

用于修复Msg 8152、级别16、状态14、行114字符串或二进制数据将被截断。

代码语言:javascript
复制
SET ansi_warnings OFF
GO
票数 6
EN

Stack Overflow用户

发布于 2014-11-07 07:00:31

代码语言:javascript
复制
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 
票数 4
EN

Stack Overflow用户

发布于 2014-11-06 23:30:09

此错误表示您要存储一些更大的东西,而它是存储的。您可能需要检查是否要存储一些字符串,其中包含的字符是否超过50个,这些字符包含在@declaredvara或@declaredvarb或@declaredvarc或@declaredvard或其他变量或表列中。例如,您可以将@test定义为varchar(2),然后尝试将'vahid‘插入其中。在这种情况下,将引发类似的异常。有两种方法(据我所知)可以找到错误恢复线:

  1. 如果需要找到发生错误的确切行,则可能需要使用sql server调试工具调试SP (请参阅有关Server 这里中调试的更多信息)。
  2. 还可以使用TRY...CATCH块检查SP中哪个代码块会导致错误。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26791178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档