2016-12-23 94 views
0

我需要動態的方式創建用戶定義的類型,但sp_executesql的拋出錯誤,但簡單EXEC()的作品

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 pagesp_executesql

但我認爲這不符合您的使用案例。

+0

最好使用QUOTENAME作爲列名。 –

+0

您的示例與我的示例之間的關鍵區別是什麼?因爲我用同樣的錯誤以這種方式嘗試了它。 – Muflix

+1

@Muflix道歉,看起來你不能在調用'sp_executesql'的時候直接連接字符串 - 我編輯了我的答案以反映這一點,並且這次測試了結果。 – 3N1GM4

相關問題