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的最后一行有两个明显问题:
- 结尾缺少了闭合OPENQUERY所需的单引号和右括号,导致生成的SQL语句不完整
- 手动拼接引号的逻辑容易出错,而且没有处理
@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
相关产品推荐
相关产品推荐

