Включая список параметров в OPENQUERY - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь получить значения от внешнего сервера базы данных, выполняя следующий код:

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 "MSDASQL«для связанного сервера« DICOI_LINKEDSERVER »вернул сообщение« ERRO: синтаксическая ошибка в конце ввода;
Нет запроса с этим дескриптором выполнено ».

Msg 7350, уровень 16, состояние 2, строка 1
Не удалось получить информацию о столбце от поставщика OLE DB "MSDASQL" для связанного сервера "DICOI_LINKEDSERVER".

Я исследовал приведенные выше ссылки, чтобы попытаться разрешить его:

Может ли кто-нибудь помочь мне решить эту проблему?

Заранее спасибо.

1 Ответ

0 голосов
/ 26 мая 2018

Перед выполнением запроса с 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'');';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...