2014-09-04 60 views
0

我有一個INSERT語句,它將大量數據插入tableB的tableA中。
這裏是一個非常簡單的代碼例如:以毫秒爲單位獲取錯誤的行ID sql

INSERT [dbo].[tableA] 
SELECT field1 [field_1] 
FROM [dbo].[tableB] 
WHERE [codeID] IN (SELECT [codeID] FROM #tempTable WHERE RecordMarker = 1) 

有一個臨時表至極抱codeIDs(至少1個或更多個)需要插入到表A。

但是tableB中會有不合法的數據,無法插入tableA中。例如,一個數字(30,2)字段不能映射到數字(13,2)。在這種情況下,我得到一個excetpion,聲明已被終止。

如何獲取CodeID或tableB中的錯誤行號如果出現錯誤?現在我只有錯誤信息但沒有行號。

例如: 消息8115,級別16,狀態8,行1 算術溢出錯誤將數值轉換爲數據類型數值。 該聲明已被終止。

編輯:有不同字段類型的表中有多個字段。所以數字類型只是一個例子。

+2

你可以將其轉換爲一個循環進行調試。 – 2014-09-04 13:31:09

+0

現在我做到了。循環通過。但不太有效,因爲它非常緩慢。表現並不是最好的。 – Blackstar 2014-09-04 13:33:17

+1

但你只是想知道行號。我假定找到無效數據的來源。一旦你解決了核心問題,你可以再次使用基於集合的方法。 – 2014-09-04 13:37:17

回答

1

請嘗試以下方法:

INSERT [dbo].[tableA] 
SELECT field1 [field_1] 
FROM [dbo].[tableB] 
WHERE [codeID] IN (SELECT [codeID] FROM #tempTable WHERE RecordMarker = 1) 
AND [codeID] <= 9999999999999.99; 

INSERT ErrorLog 
SELECT * 
FROM [dbo].[tableB] 
WHERE [codeID] > 9999999999999.99; 
1

如果你知道你有這個問題的目標字段的類型,在這種情況下的(13,2)精度的數字,你可以運行在潛在問題字段上對TRY_CONVERT選擇臨時表並篩選NULL結果。如果你想確保它能夠成功運行並且不嘗試插入那些「壞」行,你可以在你的插入語句中添加一個WHERE子句。

CREATE TABLE #t (x NUMERIC(30,2),field2 varchar(10)) 
INSERT INTO #t 
SELECT 123456789.23,'x' 
UNION 
SELECT 12345678901212343.23,'y' 
UNION 
SELECT 12345678923523523235.23,'z' 
UNION 
SELECT 42.0, 'a' 
SELECT *, TRY_CONVERT(NUMERIC(13,2),x,1) [Converted to numeric(13,2)] FROM #t 

參考:http://msdn.microsoft.com/en-us/library/hh230993.aspx

+0

他在SQL 2005上。 – SQLChao 2014-09-04 13:54:45

+0

D'oh!新答案: 第1步。升級SQL Server環境。 步驟2. ???? ... – 2014-09-04 13:56:05

相關問題