Переменная таблицы не работает в динамическом SQL - PullRequest
2 голосов
/ 22 февраля 2012

Мой триггер, как показано ниже,

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'','''+@ColName+''',''Insert'','+@ColName+',1,getdate()
        from @inserted'

       EXEC sp_executesql   @QueryText  

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

Когда я пытаюсь вставить в таблицу std_table в DA Layer, я получаю исключение Must declare the table variable "@inserted".

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

Я пытался с

select * 
into #inserted
from inserted

Это работает, но так как к моему приложению обращаются многие пользователи по сети, это вызовет проблемы с данными. Так что я не могу использовать это.

1 Ответ

1 голос
/ 22 февраля 2012

Несколько вещей здесь не так.

  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...