如何向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为:
该语句符合OPENQUERY语法要求,可正常完成多值筛选。SELECT * FROM OPENQUERY(MyLinkedServer, 'SELECT * FROM pubs.dbo.authors WHERE state IN (''CA'',''TX'',''SD'')' )
内容的提问来源于stack exchange,提问作者user61578
相关产品推荐
相关产品推荐

