Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何从对OPENROWSET的动态调用中获取数据?_Sql Server_Tsql_Sql Server 2008 R2_Openrowset - Fatal编程技术网

Sql server 如何从对OPENROWSET的动态调用中获取数据?

Sql server 如何从对OPENROWSET的动态调用中获取数据?,sql-server,tsql,sql-server-2008-r2,openrowset,Sql Server,Tsql,Sql Server 2008 R2,Openrowset,T-SQL的OPENROWSET()函数的一个奇怪属性是它不能接受远程执行的“查询”中的参数。为了解决这个问题,我想您必须创建一个长字符串,其中包含OPENROWSET调用和参数化查询 鉴于此限制,我正试图让这段代码正常工作: Declare @DataId int Declare @RecordType varchar(50) Declare @Filter varchar(50) -- ... SELECT TOP 1 @RecordType = recordType,

T-SQL的
OPENROWSET()
函数的一个奇怪属性是它不能接受远程执行的“查询”中的参数。为了解决这个问题,我想您必须创建一个长字符串,其中包含
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
的功能?


有什么语法上的甜点可以让我绕过限制,让它按照我想要的方式工作吗?

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

您可以先插入到表变量中,然后从中提取值

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

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

您可以先插入到表变量中,然后从中提取值

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

感谢@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

感谢@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