2014-01-28 40 views
0

存儲過程我想創建一個新的存儲過程sp_sync_table(在SQL Server 2012),它接受一個參數(鏈接服務器名稱)。然而,突出聲明@linkedServerName變量是不夠的。 CREATE PROCEDURE指令失敗,因爲它無法解析@linkedServerName,除非@linkedServerNameSET爲特定名稱。與@variable服務器名稱

它失敗,錯誤:

Msg 102, Level 15, State 1, Procedure sp_sync_table, Line 31
Incorrect syntax near '.'.)

很明顯,我不能提供一個特定的名稱,必須要通過

exec sp_sync_table server_name 

這是失敗的部分中傳遞:

CREATE PROCEDURE sp_sync_table 
    @linkedServerName AS VARCHAR(50) 
AS BEGIN 
. 
. 
. 
DECLARE cursorX CURSOR FOR 

SELECT col1, col2, col3, col4 FROM @linkedServerName.[db-name].[dbo].[table] 

OPEN cursorX 
. 
. 
. 

該方案的解決方法是什麼?

+2

我認爲動態SQL將是你唯一的選擇 – jazza1000

+0

好了,不知道你是遊標裏面做什麼,但有可能在連接服務器創建此過程,只是遠程調用的程序,而不是試圖在調用方的動態SQL中將所有這一切混爲一談? –

+0

..這太容易了(鏈接的服務器不是我的),所以很不幸:) – Milan

回答

1

你可以使用動態sql嗎?我知道這不是安全的做法,但可以將查詢放入字符串中並執行字符串。只需要非常小心用戶傳入的@linkedServerName。很明顯,您將執行任何允許用戶輸入的內容。不知道這將如何與光標工作 - 我從來沒有嘗試過。

CREATE PROCEDURE sp_sync_table 

    @linkedServerName AS VARCHAR(50) 

AS BEGIN 

. 
. 
. 
DECLARE queryToExecute varchar(max) 
select queryToExecute = 'DECLARE cursorX CURSOR FOR' 
select queryToExecute = queryToExecute + 'SELECT col1, col2, col3, col4 FROM' 
select queryToExecute = queryToExecute + ' ' + @linkedServerName + '.[db-name].[dbo].[table]' 
select queryToExecute = queryToExecute + 'OPEN cursorX...' 
exec(queryToExecute) 
+0

我試過這個(類似的exec語句),但沒有運氣。我只是試過你的版本(上面),它會拋出col1,col2,col3不存在的錯誤......任何想法?這是否只適用於較舊的SQL? – Milan

+0

你真的有一個名爲linkedServerName的列嗎?[db-name]。[dbo]。[table]。[Col1]?名爲db-name的模式和名爲table的表有點不同尋常。較舊的SQL通常適用於較新的版本,這在這裏不是問題。 – Twelfth

+0

我建議你使用動態SQL來獲取數據到一個loca臨時表中,然後你的光標就會移到你的光標上 - 維護起來會更簡單,並且可能更快(depdning多少遠程記錄) –