2012-02-22 60 views
2

我的觸發如下,表變量的動態SQL不工作

Alter TRIGGER [dbo].[LogTable_InsertTrigger] on [dbo].[std_table] AFTER INSERT 
as 

    DECLARE @ColName varchar(50), @QueryText nvarchar(max) 

    declare @inserted TABLE(
     [CountryID] [int] NOT NULL, 
     [Country] [nvarchar](255) NOT NULL, 
     [RegionId] [int] NULL 
    ) 
    insert into @inserted 
    select * from inserted 

    DECLARE objCursor CURSOR FAST_FORWARD FOR 
    select ColName from dbo.getColumnNames('std_table') 

    OPEN objCursor 
    FETCH NEXT FROM objCursor INTO @ColName 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     set @QueryText= ' 
     insert into dbo.LogTable 
     (StandardType,Attribute,Action,NEwValue,UserId,ModifiedDate) 
     select ''Country'','''[email protected]+''',''Insert'','[email protected]+',1,getdate() 
     from @inserted' 

     EXEC sp_executesql @QueryText 

     FETCH NEXT FROM objCursor INTO @ColName 
    END 
    CLOSE objCursor 
    DEALLOCATE objCursor 

當我嘗試插入到DA層我得到的異常Must declare the table variable "@inserted"表std_table。

我無法直接使用插入的表格,因爲我正在寫一個動態查詢,其中的魔法表格無法工作。所以我試圖將插入表中的數據轉儲到臨時表並從中訪問。

我試着用

select * 
into #inserted 
from inserted 

這工作,但因爲我的應用程序被許多用戶通過網絡訪問這會導致數據的問題。所以我不能使用這個。

+2

光標在觸發器:你要TSQL地獄! – 2012-02-22 03:55:02

回答

1

這裏有幾個錯誤。

  1. 這是一個表變量,而不是用戶定義的表類型。
  2. 如果#temp表正常工作,您爲什麼會認爲這會導致多個用戶出現數據問題?每個用戶將獲得他們自己版本的#temp表。
  3. 如果您知道只有三列,並且您可以對錶變量聲明進行硬編碼,那麼爲什麼需要動態生成三組插入?列名不是CountryID,Country,RegionID

如果你真的需要動態地這樣去做,好像你可以做到這一點更簡單的方法,而不顯式遊標 - 不,這是一定是一件壞事,或者它會執行比低於更糟,但光標只是更加詳細和醜陋的代碼:

ALTER TRIGGER [dbo].[LogTable_InsertTrigger] 
ON [dbo].[std_table] 
AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT * INTO #t FROM inserted; 

    DECLARE @sql NVARCHAR(MAX); 

    SET @sql = N''; 

    SELECT @sql = @sql + CHAR(13) + CHAR(10) + N'INSERT INTO dbo.LogTable 
     (StandardType,Attribute,Action,NewValue,UserId,ModifiedDate) 
     SELECT ''Country'','''+ColName+''',''Insert'','+ColName+',1,GETDATE() 
    FROM #t;' 
    FROM dbo.GetColumnNames('std_table'); 

    EXEC sp_executesql @sql; 
END 
GO 
+0

2.謝謝,我覺得我理解錯了 – 2012-02-22 03:45:06

+0

3.我的表有三列以上。同樣的查詢將重複20個表格,這些表格總共會有200列左右 – 2012-02-22 03:45:59

+2

好吧,這聽起來像是設計災難,但上述觸發器應該適用於任意數量的列(假設函數是準確的,並且所有這些列實際上在'inserted'中存在)。您可能會考慮更改跟蹤或創建與主表匹配的影子表,以便您可以執行1次插入而不是200次。 – 2012-02-22 03:54:17