использовать переменную при создании триггера sql - PullRequest
0 голосов
/ 12 июля 2011

Я пытаюсь создать триггер динамически, и мне нужно заменить часть оператора create, в частности имя базы данных, с которой выполняется соединение.

CREATE TRIGGER [dbo].[tr_UseType_update] ON [dbo].[UseType] FOR UPDATE AS
BEGIN
  SET NOCOUNT ON 
  INSERT [dbo].[UseType]
  SELECT 'Updated', i.*
    FROM inserted
   INNER JOIN [(SELECT DB_NAME())].[dbo].[UseType] i ON inserted.[UseTypeID] = i.[UseTypeID]
END

Я пробовал это, но, очевидно,он просто использует текст, который фактически не оценивает SELECT DB_NAME (), есть ли способ получить его для оценки этого значения.

Я использую sql 2005/8.У нас есть инструмент развертывания, который использует sqlcmd, поэтому запасным вариантом будет изменение инструмента для приема переменных, которые можно передать в sqlcmd, но если я смогу уменьшить объем работы и выполнить ее в самом скрипте (который генерируется), который быбудь удобен.

Ответы [ 2 ]

4 голосов
/ 12 июля 2011

Единственным способом было бы использовать динамический sql.

Нет другого способа параметризации имен баз данных или имен таблиц.

При этом динамическое создание триггера, подобного этому, выглядит какопасная идея.

Самый простой способ сделать то, что вы хотите, будет выглядеть примерно так:

USE MyDataBase

DECLARE @DB varchar(100) = 'MyOtherDatabaseThatIAmJoiningToInTheInsert'
DECLARE @SQL Varchar (MAX)

SET @SQL = '
CREATE TRIGGER [dbo].[tr_UseType_update] ON [dbo].[UseType] FOR UPDATE AS
BEGIN
  SET NOCOUNT ON 
  INSERT [dbo].[UseType]
  SELECT ''Updated'', i.*
    FROM inserted
   INNER JOIN ' + @DB + '.[dbo].[UseType] i ON inserted.[UseTypeID] = i.[UseTypeID]
END'

Обязательно прочитать это, прежде чем делать какой-либо динамический SQL-код!

0 голосов
/ 12 июля 2011

Вы можете потенциально выполнить динамический sql и загрузить его во временную таблицу, которая, в свою очередь, будет доступна для триггера.

CREATE TRIGGER [dbo].[tr_UseType_update] ON [dbo].[UseType]
    FOR UPDATE
AS
    BEGIN
        SET NOCOUNT ON
        CREATE TABLE #t (userTypeId INT)
        DECLARE @sql NVARCHAR(500) SET @sql = 'insert into #t select userTypeID from ' + DB_NAME() + '.dbo.UseType'
        EXEC sp_executeSQL @sql

        INSERT  [dbo].[UseType]
                SELECT  'Updated',
                        i.*
                FROM    inserted
                        INNER JOIN #t i ON inserted.[UseTypeID] = i.[UseTypeID]
    END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...