2014-01-24 8 views
0

Из-за ограничений на рабочем месте я должен использовать локальную хранимую процедуру для вызова другого удаленного хранимого процесса на связанном сервере sql, однако проблема заключается в передаче необходимого параметра удаленной памяти Proc.Передача параметров concat запроса в SQL OPENQUERY

Это запрос, я построил:

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

Для того, чтобы пройти @id к удаленному хранимой процедуре, я понимаю, я мог сростить выше в виде строки, а затем использовать exec

Что-то вдоль линий of

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

Я не могу получить локальную сохраненную процедуру для успешного вызова другого. Единственный кавычек не помогает!

я получаю ошибку: 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, например, [Л. Использование параметра с EXECUTE и АТ 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 на указанный сервер." [Ref: "RPC Out Включает RPC на указанный сервер"] (http: // technet. microsoft.com/en-us/library/ms186839(v=sql.105).aspx) –

+0

Невозможно настроить эту настройку - или, по крайней мере, в ближайшее время - поэтому я пытаюсь использовать 'sp_executesql' – Lee

Смежные вопросы