包括OPENQUERY中的参数

gap*_*e69 79 sql parameters openquery

如何在sql openquery中使用参数,例如:

SELECT * FROM OPENQUERY([NameOfLinkedSERVER], 'SELECT * FROM TABLENAME
where field1=@someParameter') T1 INNER JOIN MYSQLSERVER.DATABASE.DBO.TABLENAME
T2 ON T1.PK = T2.PK
Run Code Online (Sandbox Code Playgroud)

Gar*_*ett 143

OPENQUERY文档中可以看出:

OPENQUERY不接受其参数的变量.

请参阅此文章以获取解决方法.

更新:

如上所述,我将包括以下文章中的建议.

传递基本值

当已知基本的Transact-SQL语句,但您必须传入一个或多个特定值时,请使用与以下示例类似的代码:

DECLARE @TSQL varchar(8000), @VAR char(2)
SELECT  @VAR = 'CA'
SELECT  @TSQL = 'SELECT * FROM OPENQUERY(MyLinkedServer,''SELECT * FROM pubs.dbo.authors WHERE state = ''''' + @VAR + ''''''')'
EXEC (@TSQL)
Run Code Online (Sandbox Code Playgroud)

传递整个查询

当您必须传入整个Transact-SQL查询或链接服务器的名称(或两者)时,请使用与以下示例类似的代码:

DECLARE @OPENQUERY nvarchar(4000), @TSQL nvarchar(4000), @LinkedServer nvarchar(4000)
SET @LinkedServer = 'MyLinkedServer'
SET @OPENQUERY = 'SELECT * FROM OPENQUERY('+ @LinkedServer + ','''
SET @TSQL = 'SELECT au_lname, au_id FROM pubs..authors'')' 
EXEC (@OPENQUERY+@TSQL) 
Run Code Online (Sandbox Code Playgroud)

使用Sp_executesql存储过程

要避免使用多层引号,请使用与以下示例类似的代码:

DECLARE @VAR char(2)
SELECT  @VAR = 'CA'
EXEC MyLinkedServer.master.dbo.sp_executesql
N'SELECT * FROM pubs.dbo.authors WHERE state = @state',
N'@state char(2)',
@VAR
Run Code Online (Sandbox Code Playgroud)

  • 使用这些示例中的任何一个,如何检索exec命令返回的记录? (8认同)
  • @JamesChen,当你倒退时最容易想到.从OpenQuery的查询开始:`SELECT*FROM tab WHERE col ='Y'`.要将该语句作为字符串传递给OpenQuery,所有单引号都需要转义:`SELECT*FROM OPENQUERY(Server,'SELECT*FROM tab WHERE col =''Y''')`.然后,要使用OpenQuery将SELECT传递给Dynamic SQL,必须转义这些引号:`EXEC sp_executeSQL'SELECT*FROM OPENQUERY(服务器,''SELECT*FROM选项卡WHERE col =''''''''''''''') "`.希望这可以帮助! (5认同)
  • 要检索记录,我总是构建一个表变量或结果集的临时表,然后使用`INSERT INTO @TableVariable EXEC sp_executeSql @ TSQL` (2认同)

Tah*_*aza 14

一旦构建完毕,就可以使用OPENQUERY执行字符串.如果你走这条路线考虑安全性并注意不要将用户输入的文本连接到SQL中!

DECLARE @Sql VARCHAR(8000)
SET @Sql = 'SELECT * FROM Tbl WHERE Field1 < ''someVal'' AND Field2 IN '+ @valueList 
SET @Sql = 'SELECT * FROM OPENQUERY(SVRNAME, ''' + REPLACE(@Sql, '''', '''''') + ''')'
EXEC(@Sql)
Run Code Online (Sandbox Code Playgroud)


Nei*_*oss 12

MSDN页面:

OPENQUERY不接受其参数的变量

从根本上说,这意味着您无法发出动态查询.要实现样本的尝试,请尝试以下方法:

SELECT * FROM 
   OPENQUERY([NameOfLinkedSERVER], 'SELECT * FROM TABLENAME') T1 
   INNER JOIN 
   MYSQLSERVER.DATABASE.DBO.TABLENAME T2 ON T1.PK = T2.PK 
where
   T1.field1 = @someParameter
Run Code Online (Sandbox Code Playgroud)

显然,如果您的TABLENAME表包含大量数据,这也将通过网络传输,性能可能会很差.另一方面,对于少量数据,这很好用,并且避免了exec方法可能需要的动态sql构造开销(sql注入,转义引号).


小智 6

实际上,我们找到了一种方法:

DECLARE @username varchar(50)
SET @username = 'username'
DECLARE @Output as numeric(18,4)
DECLARE @OpenSelect As nvarchar(500)
SET @OpenSelect = '(SELECT @Output = CAST((CAST(pwdLastSet As bigint) / 864000000000) As numeric(18,4)) FROM OpenQuery (ADSI,''SELECT pwdLastSet
                                FROM  ''''LDAP://domain.net.intra/DC=domain,DC=net,DC=intra''''
                                WHERE objectClass =  ''''User'''' AND sAMAccountName = ''''' + @username + '''''
                          '') AS tblADSI)'
EXEC sp_executesql @OpenSelect, N'@Output numeric(18,4) out', @Output out
SELECT @Output As Outputs
Run Code Online (Sandbox Code Playgroud)

这将在变量@Output中分配OpenQuery执行的结果.

我们在MSSQL 2012中测试了Store过程,但是应该使用MSSQL 2008+.

Microsoft表示sp_executesql(Transact-SQL):适用于:SQL Server(SQL Server 2008到当前版本),Windows Azure SQL数据库(通过当前版本初始发布).(http://msdn.microsoft.com/en-us/library/ms188001.aspx)