Как передать переменную таблицы с помощью sp_executesql

Я пытаюсь создать таблицу, используя sp_executesql, но получаю сообщение об ошибке "Неверный синтаксис рядом с @_TableName". Есть идеи, что я здесь делаю неправильно?

Вот код, который я использую:

DECLARE @SQLString NVARCHAR(MAX), 
        @ParamDefinition NVARCHAR(MAX), 
        @TableName NVARCHAR(MAX);

SET @TableName  = N'[dbo].[MyTable]';

SET @SQLString = N'SELECT * FROM @_TableName;';

SET @ParamDefinition = N'@_TableName NVARCHAR(max)';

EXEC sp_executesql @SQLString, @ParamDefinition, 
                   @_TableName = @TableName;

Это приводит к ошибке:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '@_TableName'.

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

Если вам интересно, я хочу поместить этот код в хранимую процедуру, чтобы, если кто-то захочет создать или изменить таблицу, он вызовет эту хранимую процедуру, которая может запустить дополнительные проверки.

1 ответ

Решение

Разобрался с проблемой.

Очевидно, sp_executesql ожидает, что определение параметра для таблицы будет иметь тип таблицы (см. Этот ответ для примера: /questions/32609444/peredajte-peremennuyu-table-v-spexecutesql/32609459#32609459).

Более простой способ решить эту проблему - вставить имена переменных непосредственно в строку SQLStatement следующим образом:

DECLARE @SQLString NVARCHAR(MAX), 
        @TableName NVARCHAR(MAX);

SET @TableName  = N'[dbo].[MyTable]';

SET @SQLString = N'SELECT * FROM ' + @TableName + ';';

SET @ParamDefinition = N'@_TableName NVARCHAR(max);

EXEC sp_executesql @SQLString;
Другие вопросы по тегам