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

使用STRING_SPLIT结合OPENQUERY查询SQL Server链接服务器无返回结果的问题求助

STRING_SPLIT结合OPENQUERY查询SQL Server链接服务器无返回结果的问题求助

各位大佬好,我遇到了一个SQL Server链接服务器查询的问题,折腾了好久没搞定,想请大家帮忙看看:

问题背景

我有个链接服务器MyLinkedServer,因为目标表包含XML列,受限于SQL Server链接服务器的特性,没法直接用SELECT * FROM MyLinkedServer.Database.dbo.Table拉数据。所以我先把本地需要的BillID拉到临时表#AllBills,这部分是正常的:

SELECT BillID INTO #AllBills FROM Database.dbo.Table WHERE Client = 'Whoever'

接下来我想通过这个临时表的BillID,去链接服务器上查询对应的账单信息,于是写了一段动态SQL:

DECLARE @Bills VARCHAR(8000)
SET @Bills = (SELECT STRING_AGG(BillID, ',') FROM #AllBills)

DECLARE @Query VARCHAR(8000)
SET @Query = N'SELECT * FROM OPENQUERY(MyLinkedServer, ''
SELECT bil.BillNumber
, bil.BillName
FROM Bill.dbo.Bill bil
WHERE bil.BillID IN (SELECT value FROM STRING_SPLIT(''' + QUOTENAME(@Bills,'''') + ''','''',''''))
'')'

EXECUTE (@Query)

奇怪的现象

这段代码运行后立刻结束,完全没有返回任何结果;甚至我尝试用PRINT (@Query)查看生成的SQL语句,也是立刻结束,啥都不输出。

已经排查过的点

  1. 字符串拆分逻辑单独测试正常:
    运行下面的代码,能正常得到所有BillID的列表,和预期一致:
    DECLARE @Bills VARCHAR(8000)
    SET @Bills = (SELECT STRING_AGG(BillID, ',') FROM #AllBills)
    SELECT value FROM STRING_SPLIT(@Bills, ',')
    
  2. 链接服务器上手动执行查询正常:
    我手动把@Bills设成包含150个左右、每个22字符的逗号分隔字符串,在链接服务器上直接执行以下代码,能正常拿到预期的账单数据:
    DECLARE @Bills VARCHAR(8000) = '<手动输入的150个22位字符串的逗号分隔列表>'
    SELECT bil.BillNumber
    , bil.BillName
    FROM Bill.dbo.Bill bil
    WHERE bil.BillID IN (SELECT value FROM STRING_SPLIT(@Bills, ','))
    
  3. 字符串长度没问题:
    执行SELECT LEN(@Bills)返回3105,远小于VARCHAR(8000)的上限,排除了长度溢出的问题。

我的猜测

我怀疑是动态SQL拼接的时候,STRING_SPLIT部分的引号转义出了问题?特别是QUOTENAME(@Bills,'''')这里的处理,可能拼出来的SQL语法有错误,但因为PRINT @Query都没输出,我也没法直接看到生成的语句到底错在哪。

有没有大佬能帮我看看这段动态SQL的拼接哪里出了问题?或者有没有其他更靠谱的办法能实现这个需求?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 09:37:58