在 OPENQUERY 中包含参数列表
Including list of params in 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)
但我得到:
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".
我已研究以上链接以尝试解决它:
谁能帮我解决一下?
提前致谢。
在使用 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 它 returns 这个结果 :
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'');';
我正在尝试从执行以下代码的外部数据库服务器获取值:
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".
我已研究以上链接以尝试解决它:
谁能帮我解决一下?
提前致谢。
在使用 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 它 returns 这个结果 :
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'');';