Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
插入时更正记录项(SQL触发器)_Sql_Sql Server_Triggers - Fatal编程技术网

插入时更正记录项(SQL触发器)

插入时更正记录项(SQL触发器),sql,sql-server,triggers,Sql,Sql Server,Triggers,我有一个名为GLOBAL_TRACKING的查找表,它需要与另一个表USER中的数据同步。由于前端用户帐户创建的特定实例中的代码存在一些问题(我知道-理想情况下,这应该在代码中得到修复,但我没有该选项),我在全局_跟踪表中得到的条目为一个字段设置了一个空值,该字段永远不应该为空。由于这只发生在初始帐户创建时,我可以假设用户记录的LOGIN\u ID字段应该始终与全局跟踪表的ALT\u ID字段匹配 我想检查这些情况,如果为null,则从用户表中提取LOGIN\u ID值,并在插入之前将其插入全局

我有一个名为GLOBAL_TRACKING的查找表,它需要与另一个表USER中的数据同步。由于前端用户帐户创建的特定实例中的代码存在一些问题(我知道-理想情况下,这应该在代码中得到修复,但我没有该选项),我在全局_跟踪表中得到的条目为一个字段设置了一个空值,该字段永远不应该为空。由于这只发生在初始帐户创建时,我可以假设用户记录的LOGIN\u ID字段应该始终与全局跟踪表的ALT\u ID字段匹配

我想检查这些情况,如果为null,则从用户表中提取LOGIN\u ID值,并在插入之前将其插入全局跟踪表的ALT\u ID字段。我尝试过做一个常规的插入触发器(在插入时更新),但没有成功。我目前正在尝试一个“而不是插入”触发器,并且遇到了类似的错误(它被困在应用程序级别,只有一个例外:“无效的对象名‘已更新’”)。这样的事情可能吗?这是我的替代触发器:

    DECLARE @GlobalID     as NVARCHAR(50)
    DECLARE @AlternateID  as NVARCHAR(255)

    SET @GlobalID = (SELECT GLOBAL_ID FROM inserted)

    SET @AlternateID = (SELECT ALT_ID FROM inserted)

    IF (@AlternateID IS NULL
        AND ((SELECT COUNT(LOGIN_ID)
              FROM USER
              WHERE USER_ID = @GlobalID) > 0))
    BEGIN
        SET @AlternateID = (SELECT LOGIN_ID
                            FROM USER
                            WHERE USER_ID = @GlobalID)
        BEGIN
            UPDATE GLOBAL_TRACKING
            SET ALT_ID = @AlternateID 
            WHERE GLOBAL_ID = @GlobalID
        END
    END
沿着这条路走

DECLARE @GlobalID     as NVARCHAR(50)
    DECLARE @AlternateID  as NVARCHAR(255)

    SET @GlobalID = (SELECT GLOBAL_ID FROM inserted)
DECLARE @SQL VARCHAR(2000)

SET @SQL='SELECT ALT_ID FROM inserted where GLOBAL_ID= ''' + @GlobalID+'''' ;

EXEC (@SQL)


    SET @AlternateID = EXEC (@SQL)

    IF (@AlternateID IS NULL
        AND ((SELECT COUNT(LOGIN_ID)
              FROM USER
              WHERE USER_ID = @GlobalID) > 0))
    BEGIN
        SET @AlternateID = (SELECT LOGIN_ID
                            FROM USER
                            WHERE USER_ID = @GlobalID)
        BEGIN
            UPDATE GLOBAL_TRACKING
            SET ALT_ID = @AlternateID 
            WHERE GLOBAL_ID = @GlobalID
        END
    END

谢谢你的回复。我在'EXEC'关键字的'Set@AlternateID=EXEC(@SQL)'处遇到语法错误。还有几个问题-第一个初始的“EXEC(@SQL)”调用的目的是什么?我们获取GlobalID的方式与EXEC的方式有什么区别?再次感谢!