2010-11-17 141 views
0

我SQL.I正在讀觸發器在table.Below創建了兩個觸發器是新手我triggers-觸發器在SQL Server

CREATE trigger Test_TRIGGER_FOR 
ON TEST_TABLE 
for Insert 
AS 
if((Select ID from TEST_TABLE) =(Select ID from INSERTED)) 
BEGIN 
PRINT 'you have successful using FOR' 
END 
ELSE 
BEGIN 
PRINT 'ERROR AFTER' 
END 

CREATE trigger Test_TRIGGER_AFTER 
ON TEST_TABLE 
AFTER Insert 
AS 
if((Select ID from TEST_TABLE) =(Select ID from INSERTED)) 
BEGIN 
PRINT 'you have successful using AFTER' 
END 
ELSE 
BEGIN 
PRINT 'ERROR AFTER' 
END 

我已經成功創建觸發器,但是當我在我的表插入數據出現以下錯誤 -

Msg 512,Level 16,State 1,Procedure Test_TRIGGER_FOR,Line 5 子查詢返回多個值。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。 該聲明已被終止。

請告訴我我錯在哪裏。

在此先感謝。

+0

您永遠不會使用觸發器來返回打印作業。它們在大多數情況下不會在可以看到打印聲明的環境中運行。觸發器存在用於數據處理。 – HLGEM 2010-11-17 14:49:07

回答

-1

問題是因爲您正在執行返回多個記錄的SELECT ID FROM TEST_TABLE。您需要爲此添加WHERE子句,以便將其降至1個記錄,以便您的測試成功。

你可以嘗試這樣的:

DECLARE @id int; 
SELECT @id = ID from INSERTED; 

SELECT ID 
    FROM TEST_TABLE 
WHERE ID = @id; 

IF @@ROWCOUNT > 0 
BEGIN 
    PRINT 'you have successful using FOR' 
END 
ELSE 
BEGIN 
    PRINT 'ERROR AFTER' 
END 
+0

然而,重要的是要注意,INSERTED僞表可以*也包含多行。而且上面的錯誤會出現在默認的SQL 2008服務器上,因爲你從觸發器中返回結果集。 – 2010-11-17 11:52:02

+0

不正確的示例,您不應該提倡這種寫入觸發器的不正確技巧。觸發器必須假定插入或刪除將包含多行。你絕不應該這樣做:SELECT [ID] FROM插入。如果插入多個記錄,則不會得到正確的結果。你用這種技術編寫的任何觸發器都需要立即重寫,因爲你在這裏搞亂了數據完整性。這個例子非常糟糕,應該將其刪除或更改爲正確的觸發器示例,供海報學習。 – HLGEM 2010-11-17 14:48:03

1

上線

if((Select ID from TEST_TABLE) =(Select ID from INSERTED)) 

如果在表超過1項,而這是不允許的(Select ID from TEST_TABLE)將返回一個以上的價值在這樣的子選擇中。

雖然你在這裏試圖做的事情略有不清。

1

問題與兩個觸發器是這一行:

if((Select ID from TEST_TABLE) =(Select ID from INSERTED)) 

目前還不清楚你要測試什麼在這裏,但無論是TEST_TABLE和inserted表可以包含多個行。

+0

感謝Damien.Yes這是一個愚蠢的錯誤。我試圖在同一張桌子上同時使用FOR和AFTER :) – 2010-11-17 11:40:44