Sql server 如何从对OPENROWSET的动态调用中获取数据?
T-SQL的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,
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