将变量传递给 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
参数化查询,您可以 安全地 注入值。
通常使用 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;
编辑: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
参数化查询,您可以 安全地 注入值。
通常使用 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;