2014-01-24 113 views
0

由於工作場所內的約束條件,我必須使用本地存儲過程來調用鏈接sql服務器上的另一個遠程存儲過程,但問題在於將必要參數傳遞給遠程存儲PROC。將concat查詢參數傳遞給SQL OPENQUERY

這是我構造的查詢:

select * 
from OPENQUERY([REMOTE_SRVR],'exec db.dbo.dwStoredProc_sp ''@id''') 

爲了通過@id到遠程存儲的過程我明白,我可以串聯在上述作爲一個字符串,然後使用沿線exec

東西作者:

set @query = 'select * from OPENQUERY([REMOTE_SRVR], ''EXEC db.dbo.dwStoredProc_sp '' @id ''''' 
exec(@query) 

我不能讓本地存儲的proc成功地調用其他。單引號混亂沒有幫助!

我得到的錯誤:Could not find stored procedure 's'

回答

1

爲了幫助報價混亂,我喜歡做這個步驟。這是更多的代碼,但更容易理解。我不確定你的例子是否@id是一個整數。在這種情況下,您可以在__ID__附近丟失雙引號。

set @query = 'EXEC db.dbo.dwStoredProc_sp ''__ID__''' 
set @query = REPLACE(@query,'__ID__',@id) 
set @query = REPLACE(@query,'''','''''') 
set @query = REPLACE('SELECT * FROM OPENQUERY([REMOTE_SRVR], ''__REMOTEQUERY__'')','__REMOTEQUERY__',@query) 
+0

只是爲了澄清'@ id'將是一個字符串。我會嘗試這種故障的方法,謝謝。 – Lee

+0

這很好,但是我現在爲了安全而試圖使用'sp_executesql'。 – Lee

0

您可避免通過簡單的動態查詢使用EXEC (..., ParamValue) AT LinkedServer(見product's documentation,例如[L.使用參數與EXECUTE和AT linked_server_name):

1)在目標服務器:

CREATE PROCEDURE dbo.Proc1(@id NVARCHAR(50)) 
AS 
SELECT @id AS [id]; 
GO 

2)在源服務器上創建鏈接服務器,然後使用EXEC ... AT ...語法調用存儲過程:

DECLARE @p1 NVARCHAR(50); 
SET @p1 = N'DROP TABLE dbo.CocoJambo' 
EXECUTE (N'dbo.Proc1 ? ' , @p1) AT LOCALINKEDSEREV 

輸出:

id 
------------------------ 
DROP TABLE dbo.CocoJambo 
+0

我應該提到我在'openquery'之前嘗試了這個,並且沒有成功,因爲鏈接服務器沒有爲RPC配置 - 顯然。 – Lee

+0

您必須爲鏈接的服務器啓用'RPC out':'「RPC Out 啓用RPC到指定的服務器。」'[參考:「RPC Out 啓用RPC到指定的服務器」](http:// technet。 microsoft.com/en-us/library/ms186839(v=sql.105).aspx) –

+0

這是不可能的配置 - 或至少任何時候不久 - 所以我試圖使用'sp_executesql' – Lee