2010-11-17 119 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