2016-12-23 6 views
0

Мне нужно создать определенный тип пользователя в динамике, ноsp_executesql бросает ошибку, но простой EXEC() работает

The exec() путь:

-- This works 
DECLARE @column NVARCHAR(MAX) = 'Id INT' 
EXEC ('CREATE TYPE dbo.MyDataType AS TABLE ('+ @column +')') 

sp_executesql путь:

-- This does not work 
DECLARE @column NVARCHAR(MAX) = 'Id INT' 
EXECUTE sp_executesql N'CREATE TYPE dbo.MyDataType AS TABLE (@column)', @column; 

Ошибка:

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

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

Что мне не хватает?

+0

Вы не можете указать имена столбцов с параметром. Для этого вам нужно выполнить динамический SQL. То же самое верно для имен таблиц и любого имени объекта SQL. –

ответ

4

Вам необходимо использовать динамический SQL, даже при принятии sp_executesql подхода:

DECLARE @column NVARCHAR(MAX) = N'Id INT' 
DECLARE @sql NVARCHAR(MAX) 
SET @sql = 'CREATE TYPE dbo.MyDataType AS TABLE (' + @column + ')' 
EXECUTE sp_executesql @sql 

Вы можете передать определение параметров и значения в sp_executesql, как это:

DECLARE @IntVariable int; 
DECLARE @SQLString nvarchar(500); 
DECLARE @ParmDefinition nvarchar(500); 

/* Build the SQL string one time.*/ 
SET @SQLString = 
    N'SELECT BusinessEntityID, NationalIDNumber, JobTitle, LoginID 
     FROM AdventureWorks2012.HumanResources.Employee 
     WHERE BusinessEntityID = @BusinessEntityID'; 
SET @ParmDefinition = N'@BusinessEntityID tinyint'; 

/* Execute the string with the first parameter value. */ 
SET @IntVariable = 197; 
EXECUTE sp_executesql @SQLString, @ParmDefinition, 
         @BusinessEntityID = @IntVariable; 

/* Execute the same string with the second parameter value. */ 
SET @IntVariable = 109; 
EXECUTE sp_executesql @SQLString, @ParmDefinition, 
         @BusinessEntityID = @IntVariable; 

(от MSDN page на sp_executesql)

Но я не думаю, что это подойдет вашему прецеденту.

+0

Лучшее использование QUOTENAME для имени столбца. –

+0

В чем заключается основное отличие вашего примера от моего примера? потому что я попробовал это с той же ошибкой. – Muflix

+1

@Muflix извиняется, похоже, что вы не можете соединить строки непосредственно в вызове 'sp_executesql' - я отредактировал свой ответ, чтобы отразить это и протестировал результат на этот раз. – 3N1GM4