2013-11-22 4 views
2

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

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

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'. 

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

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

ответ

0

Выяснил проблему.

Очевидно, sp_executesql ожидает определения параметра таблицы для типа таблицы (см. Этот ответ для примера: https://stackoverflow.com/a/4264553/21539).

Простой способ решить эту проблему было вставить имена переменных непосредственно в строку 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; 
+3

К сожалению, это делает вас уязвимыми для атак SQL Injection, если @TableName исходит из пользовательского ввода. В этом ответе объясняется, как обратиться к этому: http://stackoverflow.com/a/1246848/109122 – RBarryYoung

Смежные вопросы