微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将变量传递到OpenQUERY SQL Server 2016

如何解决将变量传递到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来参数化您已经安全注入值的查询。

通常使用QUOTENAMEREPLACE,但是由于数值是数字数据类型,因此实际上不需要这样做,因此可以将其串联起来:

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?