You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向T-SQL的OPENQUERY传递列表参数?

向OPENQUERY传递列表参数的解决方案

场景说明

传递单个参数时,以下代码可正常运行:

DECLARE @TSQL varchar(8000), @VAR char(2)

SELECT @VAR = 'CA'
SELECT @TSQL = 'SELECT * FROM OPENQUERY(MyLinkedServer,''SELECT * FROM pubs.dbo.authors WHERE state = ''''' + @VAR + ''''''')'

EXEC (@TSQL)

但需要实现类似WHERE state IN ('CA', 'TX', 'SD')的多值筛选时,常规拼接容易因引号嵌套错误导致失败,以下是正确的实现方式:

正确实现代码

DECLARE @list NVARCHAR(MAX)
SET @list = 'CA,TX,SD' -- 用逗号分隔的无引号列表

DECLARE @sql NVARCHAR(MAX)
SET @sql = N'
SELECT * 
FROM OPENQUERY(MyLinkedServer, 
    ''SELECT * 
      FROM pubs.dbo.authors 
      WHERE state IN (''''' + REPLACE(@list, ',', ''''',''''') + '''''')''
)'

EXEC sp_executesql @sql

关键说明

  • 核心是处理动态SQL中的引号嵌套:在OPENQUERY内部的SQL语句中,单引号需要用两个单引号('')转义,因此拼接列表时要通过REPLACE将逗号替换为''''',''''',确保最终生成的内部SQL中每个值都被正确的单引号包裹。
  • 生成的最终可执行SQL为:
    SELECT *
    FROM OPENQUERY(MyLinkedServer,
        'SELECT * FROM pubs.dbo.authors WHERE state IN (''CA'',''TX'',''SD'')'
    )
    
    该语句符合OPENQUERY语法要求,可正常完成多值筛选。

内容的提问来源于stack exchange,提问作者user61578

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:18:32