2012-03-22 64 views
0

我試圖使用SQL Server動態生成的完全限定表名的變量表名2008.例如,這不起作用:從串聯在FROM子句中

select max([id]) from @dbName+N'.[T1]' 

這將給出錯誤等:

消息102,級別15,狀態1,線73

鄰近 '+' 不正確的語法。

我知道,像這樣的工作:

declare @qualifiedTable varchar(200) = @dbName+N'.[T1]' 
select max([id]) from @qualifiedTable 

但我必須這樣做的時候,這地段,所以我真的很想做的線。可能嗎?

+0

不,你的其它方法將不能工作。您需要將腳本構建爲字符串並使用'EXEC(@string)'或'EXEC sp_executesql @ string'來調用它,就像Duane Theriot的回答一樣(確保@string是'nvarchar')。看看[這個問題](http://stackoverflow.com/questions/4136447/selecting-from-a-table-where-the-name-is-passed-as-a-variable「從表中選擇該名稱作爲變量傳遞「)。 – 2012-03-22 09:36:29

+0

這個問題之前已經提過很多次了,但這裏的一個具體問題是,因爲你的查詢不包含模式,所以它無法工作。你需要這個:DatabaseName.SchemaName.ObjectName – Pondlife 2012-03-23 12:16:15

回答

2

這應該工作:

sp_executesql N'select (max([id]) from ' + @dbName + '.dbo.[T1]'; 
+1

如果'@ dbName'是'varchar'(而不是**'nvarchar **),那麼你可能需要把'N'放在一個字符串常量前面在你的表達式中,如下所示:'sp_executesql N'select(max([id])from'+ @dbName +'。[T1]';',結果爲'nvarchar',因爲這是'sp_executesql'類型需要代表動態腳本的參數 – 2012-03-22 09:30:49

+1

您忘記了模式名稱,您需要一個由三部分組成的名稱來查詢另一個數據庫中的一個對象 – Pondlife 2012-03-23 12:15:47

+0

這是一個很好的觀點,我在.dbo模式中添加了,應該用與「T1」關聯的實際模式,還添加了Andriy建議的「N」。 – 2012-03-23 15:12:29