2017-01-20 11 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 на три триггера, то есть вставку, обновление и удаление, чтобы обойти это, однако предпочли бы сохранить 1 триггер обрабатывать все)

Любые предложения будут оценены, спасибо

+0

Как вы говорите, строка обрезается? Вы уверены, что 'SET @STR_Trig = @STR_Trig + ..' это то, как вы выполняете. –

+0

Я видел, что этот метод, на который здесь ответил мартин-кузнец 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