ビューへの挿入と更新を取得するトリガーがあります。変更されている列を見つけて、正しいテーブルに値を取得する必要があります。
INSERT INTO TempTableAttr_Lot(ID, [% Num]) VALUES(3, 24.0)
トリガーで、ID および [% Num] 列の値を取得する方法を理解しようとしています。問題は、挿入または更新に設定されている 32 の異なる列が存在する可能性があるため、その列が「挿入された」テーブルにあるかどうかを確認するためにループしたいことです。
問題の 1 つは、動的クエリを作成するために exec または execute を使用すると、insert が対象外になることです。
ビューは動的であり、属性が追加された場合、ストアド プロシージャによってビューが再生成されるため、特定の時点でビューに含まれる列名を推測することはできず、拡大および縮小する可能性があります。
理想的にはやりたいのですがSET @Value = (SELECT i.[@Name] FROM inserted i)
、 @Name は列名ではなく、トリガーの変数なので、試したとき
DECLARE @ValueTable TABLE ( value sql_variant)
INSERT INTO @ValueTable EXECUTE('SELECT i.[' + @Name + '] FROM inserted i')
SET @Value = CONVERT(nvarchar(128), (SELECT DISTINCT * FROM @ValueTable))
挿入されたものが範囲外のように見えるため、これは機能しませんでした。
最初のループでは @Name = 'ID' で、2 番目のループでは挿入されなかった 'Col2' になるため、@Value の値は null である必要があり、終了するまで可能な列名をループし続けます。トリガーが処理されます。
私はこれをトリガーと呼んでいます。次のように定義されています。
CREATE TRIGGER TempTableAttr_LotTrigger
ON TempTableAttr_Lot
INSTEAD OF UPDATE, INSERT
現在、INSERT コマンドでテストしています。更新を行うときに、「削除された」テーブルを確認する必要がある場合があることに気付きました。
更新:これを機能させる方法を確認するために、テストのために、現時点で1行のみが挿入されていると想定しています。これはエンティティ属性値データベース用ですが、リレーショナルに見えるビューがあります。Integration Service を使用している場合、更新が進行中の場合、ビューへの挿入または更新によってトリガーが呼び出されます。正しいテーブルを正しい値で更新できるように、必要な情報を取得する方法を理解しようとしています。