2014-11-06 119 views
1

場景:大型存儲過程每年運行數千次,每週6天,每週運行一次。對於這一具體情況,我得到一個錯誤Msg 8152,Level 16,State 14,Line XXX字符串或二進制數據將被截斷

消息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 error read,所以我至少可以縮小哪些表格必須檢查。此存儲過程涉及大量表格。

***這兩個聲明的變量(在調整GO之前和之後)它指向的是自重,它們是nvr使用的。

獎金信息:我運行的存儲過程中填充了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 

編輯:DB運行SQL Server 2005 EDIT2:我使用的是SQL Server 2008中進行編輯。 - 所以調試不是一個選項

+0

您是否將'@ declaredvarb'作爲varchar(50)與其sql服務器表等效項進行了比較?在某處你可能要放入1)超過50個字符的變量,2)列模式比數據更窄(字符串比列更大)或者3.將Unicode數據放入varchar字段。 – paqogomez 2014-11-06 23:16:14

+0

行號只會告訴你從批處理開始的行數,所以如果你有一個'GO'(或其他的東西,如果你重新定義了你的批處理分隔符),它就是從那裏開始的行數。 – DavidG 2014-11-06 23:21:27

+1

雙擊SSMS中的錯誤消息,它應該佔用錯誤行的位置。 – 2014-11-06 23:27:31

回答

3

這個錯誤表明你將存儲更大的東西,它是存儲。您可能需要檢查是否要在@declaredvara或@declaredvarb或@declaredvarc或@declaredvard或任何其他變量或表格列中存儲多於50個字符的字符串。例如你可以將@test定義爲varchar(2),然後嘗試在其中插入'vahid'。在這種情況下,將拋出類似的異常。有2路(我知道),你可以找到錯誤ocurance行:

  1. 如果你需要找到錯誤發生的確切行,你可能需要在SP使用SQL Server調試工具來調試(閱讀更多關於在Sql Server中進行調試here
  2. 您也可以使用TRY ... CATCH塊來檢查您SP中哪些代碼塊導致錯誤。
+0

不幸的是,數據庫是SQL Server 2005,但編輯我有的軟件是2008年,所以調試不是一個選項。 – MADnoobie 2014-11-07 14:56:53

4
BEGIN CATCH  
DECLARE @body VARCHAR(4000)  
SET @body='<b>Exception in spname </b><br/>'  
SET @[email protected] + (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 
+0

我不經常使用TRY CATCH(壞習慣?我仍然是一個新手)但是你不需要PRINT cmd來查看錯誤嗎? – MADnoobie 2014-11-07 15:11:17

0

原來在該地區的一個變量被宣佈,但從來沒有給出一個值。

該變量後來被用作從內執行另一個存儲過程的參數。 導致一個null參數被傳遞給一個不能包含它的參數。

謝謝大家的回覆。

相關問題