ビューへの挿入および更新を取得するトリガーがあります。私は、変更されている列を見つけて、正しい表に値を取得する必要があります。列名が変数の場合、INSERTからのトリガー内の列値を動的に見つける
INSERT INTO TempTableAttr_Lot(ID, [% Num]) VALUES(3, 24.0)
IDと[%Num]列の値を取得する方法を見つけようとしています。問題は、挿入または更新で設定されている32個の異なる列がある可能性があるため、その列が 'inserted'表にあるかどうかを調べるためにループしたいと思っています。
1つの問題は、私がexecまたはexecuteを使用して動的クエリを作成する場合、挿入されたものがこれのスコープにないことです。
属性が追加された場合、ビューはストアドプロシージャによって再生成されるため、特定の時点でどの列名がビューに含まれていると想定することはできません。
理想的には私が私が
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))
をしようとしたときに挿入されたように、これは動作しませんでした、SET @Value = (SELECT i.[@Name] FROM inserted i)
をしたい。しかし@Name列名ではなく、私のトリガー内の変数ですが中にならないように見えます範囲。
@Name = 'ID'と2番目のループは挿入されていない 'Col2'になりますので、@Valueの値はnullになります。私は終了し、トリガーが処理されます。私は現時点ではINSERTコマンドを使用してテストしてい
CREATE TRIGGER TempTableAttr_LotTrigger
ON TempTableAttr_Lot
INSTEAD OF UPDATE, INSERT
:私はトリガーを呼び出しています
、それは次のように定義されます。私は更新をするときに私は '削除'テーブルを見てする必要がありますことを知っている。
更新:私のテストでは、これを動作させる方法を見るために、現在のところ1行だけが挿入されていると仮定しています。これはエンティティ属性値データベースのためのものですが、私はそれをリレーショナルに見せるビューを持っています。 Integration Serviceを使用しているときに、更新が実行されている場合、ビューへの挿入または更新によってトリガーが呼び出されます。私は必要な情報を取得する方法を理解しようとしているので、正しい値で正しいテーブルを更新できます。
これらの列の値が実際に起こっていますか?これは@ValueTableではありません。なぜなら、A)テーブル変数は手続きの最後になくなり、B)ソース列を識別しないので、IDを[%Num]と区別することができません。また、一度に1つの行だけが挿入されていると仮定しているように見えますが、これは本当ですか? – RBarryYoung
トリガーは、1つの値だけが挿入されているとは限りません。その方法はデータの完全性の問題につながります。 – HLGEM
@HLGEM - 実際には、私のトリガは、ループしたときと同じように、複数のインサートを使ってうまくいきましたが、合併症を制限するために単純なケースで開始しました。 –