0

以下は、更新トリガーの代わりに私の一部です

    CREATE TRIGGER TestDemo ON Consultants1
    更新の代わりに
    なので
    DECLARE @Sql nvarchar(200),     
            @TableName nvarchar(50),
            @FieldName nvarchar(100),
            @PKCols VARCHAR(1000), -- 主キー       
            @Value nvarchar(100)

    SET @TableName = 'コンサルタント1'
    SET @FieldName = '表示名'
    SET @Value = 'Test123'

    SELECT * INTO #ins FROM 挿入

    SELECT @PKCols = c.COLUMN_NAME
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk 、
         INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
    WHERE pk.TABLE_NAME = @テーブル名
        AND CONSTRAINT_TYPE = '主キー'
        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 Con​​sultants1 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

もう 1 つの話は、変更後におそらくエラーが発生するということです: Msg 570, Level 16, State 1, Line 1 INSTEAD OF トリガーは直接再帰をサポートしていません。トリガーの実行に失敗しました。

これは、MSDNの INSTEAD OF トリガーと再帰に関する優れた記事です。備考欄をご確認ください。

于 2013-10-09T10:54:08.723 に答える