首页 文章

无法使用Trigger在动态SQL中绑定多部分标识符

提问于
浏览
0

以下是我而不是更新触发器的一部分

CREATE TRIGGER TestDemo ON Consultants1 
    INSTEAD OF UPDATE
    AS
    DECLARE @Sql nvarchar(200),     
            @TableName nvarchar(50),
            @FieldName nvarchar(100),
            @PKCols VARCHAR(1000),  --Primary Key       
            @Value nvarchar(100)

    SET @TableName = 'Consultants1'
    SET @FieldName = 'DisplayName'
    SET @Value = 'Test123'

    SELECT * INTO #ins FROM inserted

    SELECT @PKCols = c.COLUMN_NAME 
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk ,
         INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
    WHERE   pk.TABLE_NAME = @TableName
        AND CONSTRAINT_TYPE = 'PRIMARY KEY'
        AND c.TABLE_NAME = pk.TABLE_NAME
        AND c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME

    SELECT @Sql = 'UPDATE ' + @TableName + ' SET '
    SELECT @Sql = @Sql + @FieldName + ' = ''' + @Value + ''''
    SELECT @Sql = @Sql + ' WHERE #ins.' + @PKCols + ' = ' + @TableName + '.' + @PKCols
    EXEC (@Sql)

创建触发器时没有任何错误 . 现在我正在尝试执行以下查询

UPDATE Consultants1 SET DisplayName = 'abcd'
    where ConsIntID = 'Test123285'

它给出了一个错误说:

Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "#ins.ConsIntID" could not be bound.

我无法理解我的代码出错的地方 . 请帮忙

1 回答

  • 1

    您可以更改此行代码

    SELECT @Sql = @Sql + ' WHERE #ins.' + @PKCols + ' = ' + @TableName + '.' + @PKCols
    

    对此

    SELECT @Sql = @Sql + ' FROM #ins a INNER JOIN ' + @TableName + ' b ON a.' + @PKCols + ' = b.' + @PKCols
    

    另一个故事是,在更改之后,您可能会收到错误:消息570,级别16,状态1,行1 INSTEAD OF触发器不支持直接递归 . 触发器执行失败 .

    这是一篇关于INSTEAD OF触发器和递归的好文章in MSDN . 查看备注部分 .

相关问题