0

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

    CREATE TRIGGER TestDemo ON Consultants1
    而不是更新
    作为
    声明 @Sql nvarchar(200),     
            @TableName nvarchar(50),
            @FieldName nvarchar(100),
            @PKCols VARCHAR(1000), --主键       
            @Value nvarchar(100)

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

    SELECT * INTO #ins FROM 已插入

    选择 @PKCols = c.COLUMN_NAME
    从 INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk ,
         INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
    WHERE pk.TABLE_NAME = @TableName
        AND CONSTRAINT_TYPE = '主键'
        和 c.TABLE_NAME = pk.TABLE_NAME
        和 c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME

    选择@Sql = '更新' + @TableName + 'SET'
    选择 @Sql = @Sql + @FieldName + ' = ''' + @Value + ''''
    选择 @Sql = @Sql + 'WHERE #ins。' + @PKCols + ' = ' + @TableName + '.' + @PKCols
    执行(@Sql)

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

    更新顾问 1 SET DisplayName = 'abcd'
    其中 ConsIntID = 'Test123285'

它给出了一个错误说:

消息 4104,第 16 层,状态 1,第 1 行
无法绑定多部分标识符“#ins.ConsIntID”。

我不明白我的代码哪里出错了。请帮忙

4

1 回答 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

另一个故事是更改后您可能会收到错误消息:Msg 570, Level 16, State 1, Line 1 INSTEAD OF 触发器不支持直接递归。触发器执行失败。

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

于 2013-10-09T10:54:08.723 回答