2014-02-09 22 views
-1

我正在與SQlite合作,我有很多T-SQL,我希望以這種方式執行它們:如何在T-SQL之前拋出錯誤時執行下一個T-SQL?

T-SQL1; T-SQL2,... T-SQLN

我的T-SQL是:

insert into myRelationTable(IDTable1, IDTabl2) VALUES (1,1); 
insert into myRelationTable(IDTable1, IDTabl2) VALUES (1,2); 
insert into myRelationTable(IDTable1, IDTabl2) VALUES (1,3); 
... 

有了這個T.SQLs我想從與表2的table1的相關記錄。如果存在任何關係,則所有T-SQL都執行沒有問題,但如果對於第二個關係存在問題,則第一個是執行,但第三個和下一個T-SQL不執行。

我的quiestion是,如果有什麼方法可以繼續執行T-SQL,並且不關心如果某些T-SQL拋出錯誤,因爲我想讓它有關係,如果存在某種關係這是因爲其他用戶創建了它,所以最終我想要的是關係存在,所以我想繼續使用下一個T-SQL。

可能嗎?

但是,如果我嘗試刪除不存在的記錄,則會執行下一個T-SQL,因此SQLite不關心該錯誤並繼續執行以下操作。爲什麼當我嘗試添加新記錄時,它不能以同樣的方式工作?

謝謝。

回答

1

我強烈建議檢查是否可以執行T-SQL,而不是忽略錯誤。

DECLARE @count int 

SET @count = (SELECT COUNT(1) FROM myRelationTable WHERE IDTable1 =1 AND IDTabl2 = 1) 
IF @count = 0 OR @count IS NULL 
BEGIN 
    INSERT INTO myRelationTable(IDTable1, IDTabl2) VALUES (1,1) 
END 


SET @count = (SELECT COUNT(1) FROM myRelationTable WHERE IDTable1 =1 AND IDTabl2 = 2) 
IF @count = 0 OR @count IS NULL 
BEGIN 
    INSERT INTO myRelationTable(IDTable1, IDTabl2) VALUES (1,2) 
END 


SET @count = (SELECT COUNT(1) FROM myRelationTable WHERE IDTable1 =1 AND IDTabl2 = 3) 
IF @count = 0 OR @count IS NULL 
BEGIN 
    INSERT INTO myRelationTable(IDTable1, IDTabl2) VALUES (1,3) 
END 

從而可以很容易地在存儲過程中包裹:

你可以做到這一點。

至於你的問題的答案是:
當然,很容易:

BEGIN TRY 
    insert into myRelationTable(IDTable1, IDTabl2) VALUES (1,1); 
END TRY 
BEGIN CATCH 
    --Do nothing 
END CATCH 

BEGIN TRY 
    insert into myRelationTable(IDTable1, IDTabl2) VALUES (1,2); 
END TRY 
BEGIN CATCH 
    --Do nothing  
END CATCH 

BEGIN TRY 
    insert into myRelationTable(IDTable1, IDTabl2) VALUES (1,3); 
END TRY 
BEGIN CATCH 
    --Do nothing  
END CATCH 
0

真的是我的問題是,我使用SQLite的專家來執行T-SQL,但是這個程序檢測爲錯誤語法開始嘗試線。

解決問題另一種方法是使用igonre關鍵字這樣:

insert or ignore into my table... 

這使得,如果存在錯誤,則忽略它並執行下一條語句。但是,再次,SQLite專家會將「忽略」關鍵字檢測爲語法錯誤。

「ignore」關鍵字屬於on衝突clouse。有更多的信息在這link

謝謝。