我是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字段。
关于我做错了什么的任何建议?
答案 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