使用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语句,也是立刻结束,啥都不输出。
已经排查过的点
- 字符串拆分逻辑单独测试正常:
运行下面的代码,能正常得到所有BillID的列表,和预期一致:DECLARE @Bills VARCHAR(8000) SET @Bills = (SELECT STRING_AGG(BillID, ',') FROM #AllBills) SELECT value FROM STRING_SPLIT(@Bills, ',') - 链接服务器上手动执行查询正常:
我手动把@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, ',')) - 字符串长度没问题:
执行SELECT LEN(@Bills)返回3105,远小于VARCHAR(8000)的上限,排除了长度溢出的问题。
我的猜测
我怀疑是动态SQL拼接的时候,STRING_SPLIT部分的引号转义出了问题?特别是QUOTENAME(@Bills,'''')这里的处理,可能拼出来的SQL语法有错误,但因为PRINT @Query都没输出,我也没法直接看到生成的语句到底错在哪。
有没有大佬能帮我看看这段动态SQL的拼接哪里出了问题?或者有没有其他更靠谱的办法能实现这个需求?
内容来源于stack exchange
相关产品推荐
相关产品推荐

