将concat查询参数传递给SQL OPENQUERY

时间:2014-01-24 10:43:03

标签: sql-server tsql

由于工作区内的限制,我必须使用本地存储过程在链接的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'

2 个答案:

答案 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