2017-01-20 27 views
0

目前我正在使用SQL Server觸發器來識別表上的插入,更新和刪除操作。創建SQL Server觸發器 - 動態SQL太長

表可以在數據庫中動態創建,因此當發生這種情況時,我需要動態地創建觸發器。

因此,此時我調用一個存儲過程並傳入表名。

CREATE PROCEDURE [dbo].[AUDIT_CreateTableTrigger] 
    @STR_TableName NVARCHAR(MAX) 
WITH EXECUTE AS CALLER 
AS 
BEGIN 
    DECLARE @STR_Trig NVARCHAR(MAX) = '' 

    SET @STR_Trig = @STR_Trig + ' 
    CREATE TRIGGER [dbo].[' + @STR_TableName + '_Audit] ON [dbo].[' + @STR_TableName + '] 
    WITH EXECUTE AS CALLER AFTER 
    INSERT, UPDATE, DELETE AS 
    BEGIN 

    -- do the insert stuff 
    -- update 
    -- + delete 

    END' 

    EXEC (@STR_Trig) -- then execute the sql 

我的問題是,我注意到,exec並沒有完全讀取語句,並關閉了程序。我需要一種執行一長段SQL代碼的方法(我有一個解決方案,這涉及到將動態SQL分成3個觸發器,即插入,更新和刪除以解決此問題,但是寧願保留1個觸發器處理所有)

任何建議,將不勝感激,謝謝

+0

怎麼你說的字符串被截斷?你確定'SET @STR_Trig = @STR_Trig + ..'這是你如何執行。 –

+0

我已經看到在這裏完成的方法由martin smith回答http://stackoverflow.com/questions/12639948/sql-nvarchar-and-varchar-limits向下滾動到如何解決您遇到的問題。 –

+0

因此'SET @STR_Trig = @STR_Trig + ..'這個方法字符串永遠不會被截斷。不要使用'Print'語句來檢查動態字符串,它會截斷顯示字符串。在你的情況下,它只能顯示'4000'字符 –

回答

0

得到這個問題的修正:分手了查詢請參閱下面的解決方案

DECLARE @sql1 NVARCHAR(4000) = '', 
     @sql2 NVARCHAR(4000) = '', 
     @sql3 NVARCHAR(MAX) 

    SET @sql1 += ' 
    CREATE TRIGGER [dbo].[' + @STR_TableName + '_Audit] ON [dbo].[' + @STR_TableName + '] 
    WITH EXECUTE AS CALLER AFTER 
    INSERT, UPDATE, DELETE AS 
    BEGIN 
    BEGIN TRY 
    --sql query 
    ' 
    SET @sql2 = ' 
    --more sql query 
    END' 

SET @sql3 = CAST(@sql1 AS nvarchar(MAX)) + CAST (@sql2 AS nvarchar(MAX)) 
EXEC sp_executesql @sql3