2010-01-27 172 views
1

在可能插入多行的數據庫插入語句中,如果在第1行(很多)中有錯誤,我將如何知道確切的錯誤是什麼 - 哪一行和哪一列?有任何想法嗎?SQL Server插入語句

+1

你有一個確切的例子嗎?發佈示例查詢... – 2010-01-27 00:45:25

回答

2

如果發生錯誤,事務將被回退,並且不會插入行。

即使您沒有使用begin transaction明確啓動事務,SQL Server也不會在事務外運行insert語句。默認情況下,它會爲您啓動一個並在每個語句後提交。在自動提交中查看此MSDN article

找出確切行,你可以插入他們一次一個,也許使用臨時表:

select * into #tmp from <YourInsertQuery> 
while @@rowcount > 0 
    begin   
    insert into TargetTable 
    select top 1 * 
    from #tmp tmp 
    where not exists (
     select * 
     from TargetTable tt 
     where tt.id = tmp.id 
    ) 
    order by id 
    end 

一旦失敗,頂行中#tmp這不是在TargetTable導致錯誤。

+0

我想知道錯誤發生的位置 - 如果我插入5行,如果第4行有問題,我需要找出第4行失敗,並且如果可能的話,哪個列有問題 – 2010-01-27 00:46:47

1

首先它取決於你得到的錯誤。有很多錯誤可以發生,沒有特定的錯誤行。但讓我們考慮一下,錯誤是由特定行引起的約束違規。在這種情況下,行插入在一起的事實意味着它們是單個事務更新,所以它們都必須成功,否則都必須失敗,通常插入一半行是沒有意義的,因爲它會使數據庫不一致。

Finaly讓我們考慮一致性不是問題,你真的只想插入可以成功的行。在這種情況下,您應該查看錯誤消息,因爲它會指示出現問題。如果是主要約束違規,那麼問題與重複鍵一致。檢查約束,然後是檢查失敗的行。通過檢查錯誤信息,檢查目標表並檢查要插入的候選行,可以揭示罪魁禍首。

如果您想自動執行進程並在發生約束失敗後繼續執行,您別無選擇,只能一次插入一行。在這種情況下,失敗只會發生一行,這就是問題所在。