2009-06-02 11 views
1

我有一个触发器可以获取对视图的插入和更新。我需要找到正在修改的列,并将值存入正确的表中。当列名是一个变量时,从INSERT动态查找触发器中的列值

INSERT INTO TempTableAttr_Lot(ID, [% Num]) VALUES(3, 24.0) 

我想知道如何在我的触发器中获取ID和[%Num]列的值。问题是可能有32个不同的列在插入或更新中设置,所以我想通过查看来查看该列是否在'插入'表中。

一个问题是,如果我使用exec或execute,要构建一个动态查询,插入不在这个范围内。

该视图是动态的,因为如果添加了属性,那么该视图是由存储过程重新生成的,所以我不能假定在任何给定时间视图中的列名都可以增长和缩小。

理想我想这样做,但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',第二个是未插入的'Col2',所以@Value的值应该为空,并且我继续遍历可能的列名直到我完成了,触发器被处理。

我称它是触发,它被定义为:

CREATE TRIGGER TempTableAttr_LotTrigger 
ON TempTableAttr_Lot 
INSTEAD OF UPDATE, INSERT 

我与此刻的INSERT命令测试。我意识到,在做更新时,我可能需要查看“已删除”表。

更新:我假设此刻只有一行正在插入,对于我的测试,看看如何得到这个工作。这是一个实体属性值数据库,但我有一个使它看起来关系的视图。在使用Integration Service时,更新正在进行时,对视图的任何插入或更新都会调用触发器。我只是想了解如何获取我需要的信息,以便我可以用正确的值更新正确的表格。

+0

在哪里这些列值真的?它不是@ValueTable,因为A)表变量在过程结束时消失,B)它不能识别源列,所以你不能区分ID中的[%Num]。此外,你似乎假设一次只插入一行,这是真的吗? – RBarryYoung 2009-06-02 15:40:43

+0

你的触发器永远不能假设只有一个值被插入。这样会导致数据完整性问题。 – HLGEM 2010-05-20 21:50:12

回答

3

要访问INSERTED表,您可以执行以下操作。

SELECT * INTO #MYINSERTED FROM INSERTED 

EXEC('SELECT * FROM #MYINSERTED') 

DROP TABLE #MYINSERTED 
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; 
相关问题