Как передать переменную таблицы с помощью 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;