1

T-SQLOPENROWSET()函数的一个奇怪属性是它不能接受远程执行的“查询”中的参数。为了解决这个问题,我猜你必须创建一个包含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查询结果的能力?

有没有什么语法糖可以撒在上面来绕过限制并使这项工作按我想要的方式工作?

4

2 回答 2

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
于 2013-01-22T23:48:31.473 回答
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
于 2013-01-23T17:21:13.453 回答