将变量传递给 OpenQUERY SQL Server 2016

Passing Variable Into OpenQUERY SQL Server 2016

编辑:SQL 服务器版本 我正在尝试使用 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],''
                        SELECT
                            ticket_id
                            , 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;