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)
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)