由于工作区内的限制,我必须使用本地存储过程在链接的sql server上调用另一个远程存储过程,但问题在于将必要的参数传递给远程存储过程。
这是我构建的查询:
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)
我无法让本地存储过程成功调用另一个。单引号混乱无济于事!
我收到错误:Could not find stored procedure 's'
答案 0 :(得分: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)
答案 1 :(得分: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