将变量传递到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;

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...