如何解决将变量传递到OpenQUERY SQL Server 2016
编辑:sql Server版本 我正在尝试使用Microsoft提供的以下指南将此变量传递到我的开放式查询中:Link
我遇到了此错误消息“无法准备对帐单”。我认为这意味着OpenQuery有问题。我只是不确定什么地方出了问题。 这是代码:
DECLARE @ticketid INT,@QLFD VARCHAR(8000)
SELECT @ticketid = '296272348'
SELECT @QLFD = 'SELECT
*
FROM
OPENQUERY(
[Server_name],''
SELECT
ticket_id,QLFD_SPD_AMT
FROM [database].[dbo].[table]
WHERE ticket_id = @ticketid
'')'
EXEC (@QLFD)
您能帮我找出错误吗?我更喜欢将整个查询作为一个传递。
谢谢!
编辑:
在查看@Larnu提出的建议之后。我已将代码调整为:
DECLARE @ticketid INT--,@QLFD NVARCHAR(Max)
SELECT @ticketid = '296272348'
DECLARE @QLFD NVARCHAR(Max) = 'SELECT
*
FROM
OPENQUERY(
[Server_name],QLFD_SPD_AMT
FROM [database].[dbo].[table]
WHERE ticket_id = QUOTENAME(@ticketid,'''''''')
'')';
EXEC (@QLFD);
解决方法
正如我所提到的,您不能使用OPENQUERY
来参数化您已经安全注入值的查询。
通常使用QUOTENAME
或REPLACE
,但是由于数值是数字数据类型,因此实际上不需要这样做,因此可以将其串联起来:
DECLARE @ticketid int = 296272348; --Don't wrap numerical datatypes with quotes.
DECLARE @SQL nvarchar(MAX),@OpenQuery nvarchar(4000);
SET @OpenQuery = CONCAT(N'SELECT QLFD_SPD_AMT
FROM [database].[dbo].[table]
WHERE ticket_id = ',@ticketid,N';'); --As it's an int we dont need to quote
SET @SQL = CONCAT(N'SELECT @ticketid AS ticket_id,QLFD_SPD_AMT
FROM OPENQUERY([servername],N''',REPLACE(@OpenQuery,'''',''''''),N''');';
EXEC sys.sp_executesql @SQL,N'@ticketid int',@ticketid;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。