2009-06-02 5 views
1

ビューへの挿入および更新を取得するトリガーがあります。私は、変更されている列を見つけて、正しい表に値を取得する必要があります。列名が変数の場合、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を使用しているときに、更新が実行されている場合、ビューへの挿入または更新によってトリガーが呼び出されます。私は必要な情報を取得する方法を理解しようとしているので、正しい値で正しいテーブルを更新できます。

+0

これらの列の値が実際に起こっていますか?これは@ValueTableではありません。なぜなら、A)テーブル変数は手続きの最後になくなり、B)ソース列を識別しないので、IDを[%Num]と区別することができません。また、一度に1つの行だけが挿入されていると仮定しているように見えますが、これは本当ですか? – RBarryYoung

+0

トリガーは、1つの値だけが挿入されているとは限りません。その方法はデータの完全性の問題につながります。 – HLGEM

+0

@HLGEM - 実際には、私のトリガは、ループしたときと同じように、複数のインサートを使ってうまくいきましたが、合併症を制限するために単純なケースで開始しました。 –

答えて

3

INSERTEDテーブルにアクセスするには、次の操作を行います。

SELECT * INTO #MYINSERTED FROM INSERTED 

EXEC('SELECT * FROM #MYINSERTED') 

DROP TABLE #MYINSERTED 
+0

ありがとうございます。テーブル構造#tablenameを正常に使用することはできませんでしたが、ここではうまくいきました。 –

+0

INSERTEDマジックテーブルは、TEXT、NTEXT、またはIMAGEカラムへの参照をサポートしていません。そのような列がある場合、SELECT * INTOは失敗します。 – podosta

0
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; 
関連する問題