在OPENQUERY

时间:2018-05-25 21:27:07

标签: sql-server tsql string-concatenation openquery

我正在尝试从外部数据库服务器获取执行以下代码的值:

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)

但我得到了:

  

链接服务器“DICOI_LINKEDSERVER”的OLE DB提供程序“MSDASQL”返回消息“ERRO:输入结束时出现语法错误;
  没有使用该句柄执行查询“。

     

Msg 7350,Level 16,State 2,Line 1
  无法从OLE DB提供程序“MSDASQL”获取链接服务器“DICOI_LINKEDSERVER”的列信息。

我已经研究了上述链接以尝试解决它:

有人可以帮我解决吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

在使用EXEC运行查询之前,最好先检查生成的SQL字符串的外观。

例如,通过选择变量

DECLARE @TSQL VARCHAR(8000), @VAR CHAR(2)
DECLARE @Prefixos VARCHAR(MAX);

WITH cte AS 
(
    SELECT DISTINCT prefixo 
    FROM (values ('1'),('2'),('3')) q(prefixo)
)
SELECT @Prefixos = COALESCE(@Prefixos + ', ', '') + prefixo 
FROM cte 
ORDER BY prefixo

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'

select @TSQL as TSQL
-- EXEC (@TSQL)

然后你可以直观地检查它是否有些奇怪之处 或者只是尝试自己运行该sql并查看它是否失败。

从该T-SQL返回此结果:

SELECT * FROM OPENQUERY(DICOI_LINKEDSERVER,'SELECT * FROM ssr.vw_sigas_diage where cd_prf_responsavel in (''1, 2, 3''') order by cd_prf_responsavel, codigo

请注意,该字符串中有许多单引号。 使用带数字的IN时,不需要单引号。 最后还缺少一些东西。

...  in ('+ @Prefixos +') order by cd_prf_responsavel, codigo'');';