2011-12-24 130 views
0
declare @node int = 9044; 

DECLARE @sqlCommand NVARCHAR(MAX) = 
(
    'SELECT * FROM [@node].[database_name].dbo.table_name' 
); 

DECLARE @paramList NVARCHAR(400) = 
(
    '@node int' 
) 

exec sp_executesql @sqlCommand, @paramlist, @node; 

所以這是我試圖運行的簡單查詢。 9044很好。運行該查詢通常可以正常工作(顯然,我已經刪除了數據庫和表名)。不完全確定它有什麼問題。我得到的錯誤是:SQL Server動態查詢 - 無法找到鏈接的服務器

消息7202,級別11,狀態2,行1 不能在sys.servers找不到服務器 '@node'。驗證是否指定了正確的服務器名稱。如有必要,請執行存儲過程sp_addlinkedserver以將服務器添加到sys.servers。

就如何解決這個問題,或者我應該只寫了查詢,並使用EXEC (@sql)

+0

你是說你的動態SQL失敗,但執行靜態SQL工作嗎?針對同一臺服務器/數據庫和來自同一臺服務器/數據庫的?在您正在執行的數據庫/服務器上執行sp_addlinkedserver'9044'應該可以解決問題。 – UnhandledExcepSean 2011-12-24 20:36:34

+1

是@Node引用名爲9044的鏈接服務器? – rene 2011-12-24 20:43:27

+1

如果將@node轉換爲nvarchar會發生什麼? – UnhandledExcepSean 2011-12-25 14:17:21

回答

1

根據我的思考和測試,它只允許查詢部分中的參數,如在哪裏和其他條件。

試試這個方法。

declare @node int = 9044; 

DECLARE @sqlCommand NVARCHAR(MAX) = 
(
    'SELECT * FROM [@node].[database_name].dbo.table_name' 
); 

DECLARE @paramList NVARCHAR(400) = 
(
    '@node int' 
) 


SET @sqlCommand = REPLACE(@sqlCommand , '@node',@node) 
exec sp_executesql @sqlCommand, @paramlist, @node; 
+0

我一定會嘗試一下。謝謝 – Antares 2011-12-25 04:49:13

+0

這個工作!謝謝 – Antares 2011-12-26 16:33:12

0

您正在使用3個點的符號,它定義了server.db.table @nodes任何想法正在尋找該名稱的服務器。 ..are你找這個服務器名稱動態..最好的辦法是創建一個鏈接的服務器對象或別名,指向它,這是即

MyServer = dev-sql-server.AdventureWorks etc 

或者你可能只是需要擺脫多餘的[@節點]。

+0

是的,@node將由循環確定。 – Antares 2011-12-25 04:48:18