2017-03-31 81 views
1

我有一字排開的SQL語句的大型文件如下(?):繼續SQL Server系列從Select語句插入,儘管錯誤

INSERT INTO [table here] 
    SELECT [columns] 
    FROM OPENROWSET(xlsx tab 1) 

INSERT INTO [table here] 
    SELECT [columns] 
    FROM OPENROWSET(xlsx tab 2) 

... etc etc... 

的問題是,有時XLSX標籤#(或22)不存在並且可能導致錯誤,並且整個系列語句失敗。

有沒有辦法讓每個語句執行,就好像他們自己的查詢或忽略錯誤並繼續?

謝謝!

+1

如果您不關心某些插入可能不會發生,您可以將每個插入包裝在try/catch中。這聽起來有點脆弱,但它會做你所問的。 –

+0

@SeanLange方法可能是最好的。另一種方法是使用遊標來確定存在多少個選項卡,然後動態構建插入語句。既然你已經寫了大部分代碼,我只是把它包裝在TRY/CATCH – scsimon

+0

我試過BEGIN TRY/END TRY和CATCH,但它仍然錯誤/回滾整個塊。 IDK,如果這與OPENROWSET有關 - 我也嘗試使用「GO」,但這也沒有工作要麼 – user2089039

回答

2

錯誤SQLServer的處理是tricky.There一些錯誤中止整個批次,其中一些放棄整個會話,其終止會話不能被捕獲,並且不能從SSMS重試本身

錯誤在你的情況,如果你想要一個刀片,而不是被another..Try影響他們BATCH SEPARATORGO

INSERT INTO 
SELECT 
GO 

INSERT 
SELECT 
GO 

參考和進一步閱讀分離:
Error and Transaction Handling in SQL Server

+0

確定這是行之有效的 - 問題是我沒有回車後「GO」,所以它不在它上線。我更新了它,它工作正常。謝謝! – user2089039

1

想你想要沿着這些路線的東西。

begin try 
    INSERT INTO [table here] 
     SELECT [columns] 
     FROM OPENROWSET(xlsx tab 1) 
end try 
begin catch 
    select 'Tab1 errored' 
end catch 

begin try 
    INSERT INTO [table here] 
     SELECT [columns] 
     FROM OPENROWSET(xlsx tab 2) 
end try 
begin catch 
    select 'Tab2 errored' 
end catch