2013-06-04 91 views
2

這是沒有任何問題:爲什麼這個Dynamic Sql Statement失敗?

select COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,IS_NULLABLE 
from [AdventureWorks2012].INFORMATION_SCHEMA.COLUMNS WHERE table_name='employee'; 

但是,當它移動到一個動態語句,它總是失敗:

begin 
DECLARE @sqlstatement VARCHAR(MAX); 
DECLARE @TableName varchar(max)='employee'; 

set @sqlstatement='select COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,IS_NULLABLE 
from [AdventureWorks2012].INFORMATION_SCHEMA.COLUMNS WHERE table_name='[email protected]; 
print (@sqlstatement); 
EXECUTE(@sqlstatement); 

end 

錯誤說:無效的列名 '員工'

+1

一個最好的方式來調試動態SQL的問題就是出打印字符串,從打印語句的輸出複製到另一個查詢窗口並在那邊看看。我們傾向於依賴智能,SSMS使用的顏色編碼比您想象的要多。如果你這樣做了,你可能會很快注意到你的員工名字缺乏引號。 –

回答

9

你應該用單引號包裝它,因爲列table_name是字符串,

set @sqlstatement='select COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,IS_NULLABLE 
from [AdventureWorks2012].INFORMATION_SCHEMA.COLUMNS WHERE table_name='''[email protected]+''''; 
+0

Thanks.I完全在語句中混合了@sqlstatement字符串和一個字符串::( – FebWind

+0

不客氣':)' –

2

使用sys.sp_executesql更需要執行動態SQL,所以嘗試這一個 -

DECLARE @SQL NVARCHAR(MAX); 
DECLARE @TableName SYSNAME = 'Employee'; 

SELECT @SQL = ' 
USE [AdventureWorks2012]; 
SELECT 
     COLUMN_NAME = c.name 
    , DATA_TYPE = TYPE_NAME(c.user_type_id) 
    , CHARACTER_MAXIMUM_LENGTH = c.max_length 
    , IS_NULLABLE = c.is_nullable 
FROM sys.columns c 
JOIN sys.objects o ON c.[object_id] = o.[object_id] 
WHERE o.name = ''' + @TableName + ''''; 

PRINT @SQL; 
EXEC sys.sp_executesql @SQL;