如何从动态调用OPENROWSET获取数据?

时间:2013-01-22 23:38:41

标签: sql-server tsql sql-server-2008-r2 openrowset

T-SQL的OPENROWSET()函数的一个奇怪属性是它不能接受它远程执行的'query'中的参数。为了解决这个问题,我想你必须创建一个包含OPENROWSET调用和参数化查询的长字符串。

鉴于此限制,我正试图让这段代码起作用:

Declare @DataId int
Declare @RecordType varchar(50)
Declare @Filter varchar(50)

 -- ...

SELECT TOP 1 
    @RecordType = recordType,
    @DataId = DataId
FROM OPENROWSET('SQLNCLI', 
                'Server=MyServer;Trusted_Connection=yes;',
                'SELECT recordType, DataId FROM MyDb..data_lookup
                 WHERE Filter = ''' + @Filter+'''')

这会抛出错误

  

'+'

附近的语法不正确

现在,考虑到对OPENROWSET的限制,这是有道理的。 但是如果我将其转换为SQL字符串,我是否会失去从查询结果中设置@RecordType@DataId的能力?

我是否可以使用任何语法糖来解决这个限制并按照我想要的方式进行这项工作?

2 个答案:

答案 0 :(得分:1)

以下是动态构建字符串的一些示例:

http://support.microsoft.com/kb/314520

您可以先插入表变量,然后从那里提取值。

DECLARE @t TABLE (DataID int, RecordType varchar(50))
INSERT INTO @t
exec sp_executeSQL N'your OPENROWSERT query'

SELECT TOP 1 @DataID = DataID, @RecordType = RecordType
FROM @t

答案 1 :(得分:0)

感谢@Stuart,这是我最终使用的代码:

Declare @DataId int
Declare @RecordType varchar(50)
Declare @Filter varchar(50)

Declare @query nvarchar(4000)
 -- ...

select @query = N'select top 1 recordType, DataId
                 from openrowset(''SQLNCLI'', 
                                 ''Server=MyServer;Trusted_Connection=yes;'',
                                 ''SELECT recordType, DataId from MyDb..data_lookup
                                  where Filter = ''''' + @Filter+''''''')'
declare @t TABLE (recordType varchar(2), DataId int)

insert into @t
exec sp_executeSQL @Query

select top 1 @RecordType = recordType, @DataId = DataId
from @t