带有SQL Server的IF语句触发器

时间:2015-09-10 19:56:19

标签: sql if-statement triggers insert sql-server-2012

我是SQL的初学者,我尝试使用IF语句创建触发器。以下是触发器:

CREATE TRIGGER [Vector].[trg_insert_id]
    ON [vector].[a69]
    FOR INSERT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @OID int
    SELECT @OID = OBJECTID FROM INSERTED

    DECLARE @siteID float
    SELECT @siteID = MAX([SiteID]) FROM [vector].[a69]
    SELECT @siteID

    IF @OID NOT IN(select OBJECTID from vector.a69)
    BEGIN
        UPDATE [vector].[a69]
              SET SiteID = @siteID + 0.00001
              WHERE OBJECTID IN (@OID)  
    END
END

我试图让触发器执行的操作是在插入表后,搜索表中是否已存在插入的OBJECTID。如果没有,请将SiteID字段更新为0.00001。

当我有IF语句时,触发器不起作用。如果我删除了IF语句,则触发器可以工作,但它会为具有相同OBJECTID的其他记录增加SiteID字段。

关于我做错了什么的任何建议?

2 个答案:

答案 0 :(得分:1)

NOT IN使用起来可能很危险。如果子查询返回单个NULL值,则结果 never 为true。这可能是您的问题的原因。一个简单的解决方法是:

IF @OID NOT IN (select OBJECTID from vector.a69 where OBJECTID is not null)
. . .

我认为更好的方法是使用NOT EXISTS

IF NOT EXISTS (select 1 from vector.a69 where OBJECTID = @OID)

答案 1 :(得分:1)

不妨学会正确使用触发器。首先,如果你发现自己写的是:

   DECLARE @OID int
   SELECT @OID = OBJECTID FROM INSERTED

然后你的触发器坏了。它必须能够处理插入或删除的伪表中的多个值:

接下来这部分没有逻辑意义

IF @OID NOT IN(select OBJECTID from vector.a69)
BEGIN
    UPDATE [vector].[a69]
          SET SiteID = @siteID + 0.00001
          WHERE OBJECTID IN (@OID)  
END

如果@OID不存在于表vector.a60中,那么您无法更新它。我部分猜测你想做什么,但我认为这是你在触发器中真正想要的。

CREATE TRIGGER [Vector].[trg_insert_id]
    ON [vector].[a69]
    FOR INSERT
AS
BEGIN
    SET NOCOUNT ON;

        UPDATE [vector].[a69]
              SET SiteID = @siteID + 0.00001
              WHERE OBJECTID IN (SLECT OID FROM inserted)  

END