2012-12-21 74 views
1

我的查詢一段時間(輸出行)運行,然後停止,以示數出:如何識別導致致命錯誤的查詢結果中的行?

消息8115,級別16,狀態8,第5行算術溢出錯誤 轉換INT到數據類型數值。

這並不告訴我哪一行(由FROM子句形成的行集(而不是SQL查詢中的哪一行)導致此錯誤。

我使用了去查詢選項的舊技巧,並取消選中「set arithabort」和「set ansi_warnings」,這會導致查詢繼續運行,並將NULL放入違規單元格中。

問題是結果集可以在很多地方正確地有一個NULL,所以這沒有幫助。 (和錯誤消息同樣模糊:「發生算術溢出。」)

我試圖弄清楚這一點 - 我曾經想過使用遊標或循環,但每個都有問題。

當你得到這樣的錯誤時,你們是怎麼做的,以便找出哪一行導致它?

更新:感謝以下有用的建議;他們很好,工作很好。但是,在遇到麻煩之前(此查詢中有很多列),我只是想查看導致錯誤的行。幸運的是,我猜想查詢結果集中的最後一行是錯誤發生之前的行。當我生成查詢以查看該行下面的數據(當然不包括計算字段)時,我立即注意到其中一個INT字段中的值大於正常值。

這似乎是一個很好的第一步,然後再去編寫下面的查詢之類的問題之前 - 但是,謝謝,我會保存這些,以後肯定需要它們,當問題不是在看到有問題的數據。

+0

也許你可以在問題中添加查詢。 –

+0

它很龐大 - 並且通過邏輯來查找錯誤似乎是一種痛苦 - 似乎應該有辦法快速找到有問題的行。 – ScottEdwards2000

+0

您是指查詢中的行(如「行5」)還是表中的行? –

回答

0

Msg 8115,Level 16,State 8,Line 5將int轉換爲數據類型numeric的算術溢出錯誤。

從一個int到一個數字,我能想到的唯一的錯誤來自於在小數位之前的預置位數的溢出,例如,

select cast(123456 as numeric(7,2)) 

(7,2)表示總共7位數,小數點後2位,前5位。

對於這樣的記錄,你可以找到使用這種類型的查詢罪犯:

select ... 
    from (... table(s) ...) 
where len(left(replace(cast(col1 as varchar),'.',space(100)),100)) > 5 
    and col1 like '%.%' 

這將刷新出那些數字(有小數)的地方,那裏有5個位數以上的列小數點左邊。

+0

謝謝!看到我的更新 – ScottEdwards2000

1

我們確實需要查看您的SQL。你在使用聯盟嗎?第一行通常確定數據類型。你插入另一個表嗎? (就像我在下面假設的那樣?)

將SELECT部分​​更改爲MAX的每個類型爲INT的列,刪除此測試的所有其他列。答案可能很明顯。

SELECT MAX(myFirstIntColumn) myFirstIntColumn, 
MAX(mySecondIntColumn) 
... 
FROM same 

如果答案不是很明顯,看你正試圖插入,該馬克塞斯的至少一個不進的目標之一列。您可以通過測試您嘗試插入的數據類型獲得的每個最大值來確認這一點。例如:

SELECT CAST(1122399 AS DECIMAL(7,2)) 
+0

以上謝謝!看到我上面的更新 – ScottEdwards2000