2011-06-15 41 views

回答

1

我建議,你應該先檢查是否打算在每個要插入的記錄請求。

Create Proc Testing 
as 
Set NoCount ON 
Set XACT_ABORT ON 

Begin Try 
    Begin Tran 
    IF Not Exists(SELECT 1 FROM Table2 i JOIN Table1 t ON i.key = t.key) 
    Begin 
     //Your insert statement 
    END 
    Commit Tran 
End Try 

Begin Catch 
    Rollback Tran 
End Catch 
+0

這並不能完全回答問題。這將檢查該值是否存在於兩個表中。問題是如何在插入'Table2'之前檢查它是否在'Table1'中。如果值僅存在於「表格1」中,您的代碼將允許插入。 – NullRef 2011-06-15 22:08:01

-1

使用INSERT trigger也許?

我對語法不太確定。

CREATE TRIGGER InsertTableTrigger ON Table1 FOR INSERT 
AS 
    BEGIN 
    IF EXISTS (SELECT 1 FROM Inserted i JOIN Table1 t ON i.key = t.key) 
    BEGIN 
     RAISERROR('Transaction Failed.',16,1) 
     ROLLBACK TRAN "insert on Table1" 
    END 
    END 
GO 

插入用於訪問插入值。

+0

如何使用插入值? – user194076 2011-06-15 02:16:24

+0

更新了答案。您使用插入來訪問值。 – Lobo 2011-06-15 02:27:33

+2

假設我插入了一批100條記錄。在100箇中,它已經在其他表中包含40個記錄,並且60個是新的記錄。根據上面的說法,它應該回滾完整的批量! – Pankaj 2011-06-15 04:44:48

1

IF NOT EXISTS(SELECT * FROM表A WHERE Col1中= @Value) INSERT INTO表B(Col1中)選擇@Value

+0

我認爲,提及列名而不是明星更好。 – Pankaj 2011-06-15 08:00:20

+0

我幾年前看到過一篇關於它的文章,從SQL 2005開始,優化器將*,1或列名稱視爲EXISTS語句內部相同。我將它們進行了幾次比較,執行計劃是確切的。 – Natalia 2011-06-16 00:33:40

相關問題