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

OPENQUERY传参报错求助:输入末尾语法错误无法获取列信息

排查OPENQUERY动态SQL语法错误问题

我看了你这段从链接服务器取数的SQL代码,遇到的OLE DB语法错误大概率是动态SQL拼接时的引号不匹配+语句未闭合导致的,咱们一步步来理清楚:

首先先把你原有的代码和错误信息整理出来,方便对照:

你的原始SQL代码

DECLARE @TSQL VARCHAR(8000), @VAR CHAR(2) 
DECLARE @Prefixos VARCHAR(MAX); 
WITH cte AS ( 
    SELECT DISTINCT prefixo FROM ARH.arh.UorPos 
) 
SELECT @Prefixos = COALESCE(@Prefixos + ', ', '') + prefixo FROM cte ORDER BY prefixo 
--SELECT @Prefixos --print a list of values separated by comma. eg.: 1, 2, 3 
SELECT @TSQL = 'SELECT * FROM OPENQUERY(DICOI_LINKEDSERVER,''SELECT * FROM ssr.vw_sigas_diage where cd_prf_responsavel in (''''' + @Prefixos + ''''''') order by cd_prf_responsavel, codigo' 
EXEC (@TSQL)

遇到的错误信息

OLE DB provider "MSDASQL" for linked server "DICOI_LINKEDSERVER" returned message "ERRO: syntax error at the end of input;
No query has been executed with that handle".

Msg 7350, Level 16, State 2, Line 1
Cannot get the column information from OLE DB provider "MSDASQL" for linked server "DICOI_LINKEDSERVER".


问题根源分析

你拼接@TSQL的最后一行有两个明显问题:

  1. 结尾缺少了闭合OPENQUERY所需的单引号和右括号,导致生成的SQL语句不完整
  2. 手动拼接引号的逻辑容易出错,而且没有处理@Prefixos为空的极端情况(比如cte无数据时会生成IN ()这种无效语法)

修正后的代码

DECLARE @TSQL VARCHAR(8000), @VAR CHAR(2) 
DECLARE @Prefixos VARCHAR(MAX); 
WITH cte AS ( 
    SELECT DISTINCT prefixo FROM ARH.arh.UorPos 
) 
-- 用QUOTENAME自动给每个prefixo加单引号,比手动拼接更可靠
SELECT @Prefixos = COALESCE(@Prefixos + ', ', '') + QUOTENAME(prefixo, '''') FROM cte ORDER BY prefixo 

-- 先判断是否有有效数据,避免生成无效SQL
IF @Prefixos IS NOT NULL
BEGIN
    -- 修正引号和语句闭合逻辑,确保OPENQUERY的语法完整
    SELECT @TSQL = 'SELECT * FROM OPENQUERY(DICOI_LINKEDSERVER,''SELECT * FROM ssr.vw_sigas_diage where cd_prf_responsavel in (' + @Prefixos + ') order by cd_prf_responsavel, codigo'')'
    -- 先打印生成的SQL,确认语法正确再执行,方便调试
    PRINT @TSQL
    EXEC (@TSQL)
END
ELSE
BEGIN
    PRINT '没有可用的prefixo数据,无法执行查询'
END

关键修改点说明

  • 用QUOTENAME(prefixo, '''')自动给每个prefixo添加单引号,既能避免手动拼接引号的失误,还能处理prefixo包含特殊字符的情况
  • 补上了闭合OPENQUERY所需的'''),确保生成的SQL语句结构完整
  • 增加了@Prefixos为空的判断,防止生成IN ()这种会报错的无效语法
  • 保留了PRINT @TSQL,建议你先执行PRINT查看生成的SQL语句,直接在链接服务器对应的数据库中测试该语句,确认能正常执行后再用EXEC运行动态SQL,这是调试动态SQL的常用技巧

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:54:37