カラム名が変数であるときに動的INSERTからトリガーで列の値を見つけます
-
06-09-2019 - |
質問
私は、ビューに挿入および更新を取得するトリガを持っています。私は、変更されている列を見つけて、正しいテーブルに値を取得する必要があります。
INSERT INTO TempTableAttr_Lot(ID, [% Num]) VALUES(3, 24.0)
私は私のトリガーで、IDの値と[%数字]列を取得する方法を、把握しようとしています。問題は、挿入または更新に設定されている32種類の列があり得ることであるので、私は、その列は、「挿入」の表にあるかどうかを調べてをループにしたい。
一つの問題は、私が挿入され、動的なクエリを作成するには、EXEC使用するか、実行する場合は、このためのスコープではないということです。
ビューは、属性が追加された場合、ビューは、ストアドプロシージャによって再生されるので、私は名前が任意の時点で視野内にあるもの列と仮定することができない、それが成長し、縮小することができるという点で動的である。
理想的には私は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))
挿入されたとして、これは動作しませんでしたスコープにならないように見えます。
第1のループ@Name =「ID」の第二のためにそれが挿入されなかった「Col2に」されるので、@valueの値がヌルであるべきであり、IはIまでの可能な列名をループし続けます仕上げ、およびトリガが処理されます。
私は、トリガそれを呼び出しています、それは次のように定義されます:
CREATE TRIGGER TempTableAttr_LotTrigger
ON TempTableAttr_Lot
INSTEAD OF UPDATE, INSERT
私は、現時点ではINSERTコマンドでテストしています。私は、更新を行うとき、私は「削除」テーブルを見てする必要があるかもしれないことを実現します。
UPDATE:私はこの作業を取得する方法を確認するために、1行のみ私のテストのために、現時点で挿入されていると仮定しています。これは、エンティティ属性値データベースのですが、私はそれは、リレーショナルに見える景色を眺めることができます。 Integration Serviceを使用する場合は、更新が起こっているとき、ビューへの挿入や更新は、トリガーを呼び出します。私はちょうど私が私が正しい値で、正しいテーブルを更新することができ、必要な情報を取得する方法を理解しようとしています。
解決
あなたは次の操作を行うことができますINSERTEDテーブルへのアクセスを取得するには。
SELECT * INTO #MYINSERTED FROM INSERTED
EXEC('SELECT * FROM #MYINSERTED')
DROP TABLE #MYINSERTED
他のヒント
CREATE TRIGGER triggerRowLog_tblMember
--After INSERT
ON dbo.tblMember
AFTER UPDATE
--for EACH ROW
As
BEGIN
DECLARE @temptblCategory TABLE (
idx smallint Primary Key IDENTITY(1,1)
, CategoryID int
, CategoryName nvarchar(100)
)
declare @i int
set @i = 1
declare @catcount int
set @catcount = 0
Select @catcount= Count(*) from tblCategoryMst Where Tag = 'A' or Tag = 'L' and Active =1
declare @CatName nvarchar(100)
declare @CatID int
declare @ValueCompare nvarchar(100)
declare @PrevValueCompare nvarchar(100)
if(@catcount > 0)
begin
INSERT @temptblCategory
SELECT distinct CategoryID, CategoryName FROM tblCategoryMst Where (Tag = 'A' or Tag = 'L' )and (TableName = 'Transactions' or TableName ='tblMember') and Active =1
While @i <= @catcount
Begin
set @CatName = (SELECT CategoryName FROM @temptblCategory WHERE idx = @i)
set @CatID = (SELECT CategoryID FROM @temptblCategory WHERE idx = @i)
if(@CatName = 'Form')
Begin
set @CatName = @CatName + 'Member'
End
else if(@CatName = 'Type')
Begin
set @CatName = 'Membership' + @CatName
End
else if(@CatName = 'Address')
Begin
set @CatName = 'Cor' + @CatName
End
declare @Query nvarchar(4000)
SELECT * INTO #MYInserted FROM Inserted
SELECT * INTO #MYDeleted FROM Deleted
set @Query ='(Select @PrevValueCompare = ' + @CatName+' from #MYDeleted )'
exec sp_executesql @Query ,N'@PrevValueCompare nvarchar(50) output', @PrevValueCompare output
set @Query ='(Select @ValueCompare = ' + @CatName+' from #MYInserted )'
exec sp_executesql @Query ,N'@ValueCompare nvarchar(50) output', @ValueCompare output
DROP TABLE #MYInserted
DROP TABLE #MYDeleted
if( @ValueCompare <> 'no compare' and @ValueCompare <> @PrevValueCompare)
Begin
INSERT INTO dbo.tblLogMst(ID,IDOf,CategoryID, PreviousData, ChangedData,
ExchangeCode,CreatedBy,CreatedIP )
SELECT i.MemberID,'MS',@CatID, @PrevValueCompare, @ValueCompare ,
i.ExchangeCode,i.UpdatedBy,i.UpdatedIP
FROM Inserted i
INNER JOIN Deleted d ON i.MemberID = d.MemberID
End
set @i = Convert(int,@i) + Convert(int,1)
End
end
END;