Почему openquery возвращает 0 строк на SQL-сервере, но имеет 900 тыс. Строк на целевом сервере? - PullRequest
0 голосов
/ 27 мая 2019

Нужна помощь, чтобы понять, почему удаленный запрос, который я выполняю на сервере, возвращает 0 строк, но тот же запрос возвращает более 900 тыс. Строк в целевой БД.

длина строки менее 8000 символов, поэтому я не буду публиковать ее здесь. но это структура в основном:

declare @SQL varchar(MAX);
declare @D varchar(15);
declare @Per varchar(15);
declare @NextPer varchar(15);
declare @NextYPer varchar(15);
set @D = N'01-JUN-2019'
set @Per = N'2020004';
set @NextYPer = N'2021004'
set @NextPer = N'2020005'
set @SQL = N' SELECT  ...... '
set @SQL = N'select * from openquery ([LK1], "'+@SQL+'")';
execute( @SQL);
print @SQL;

Примечание: связанный сервер работает и успешно используется в других openqueries с более короткими строками. Я попытался использовать EXECUTE (@SQL) AT, и я все еще получаю 0 строк. Когда я исключаю вывод печати непосредственно из базы данных Oracle, запрос выполняется в течение 15 минут и дает результаты.

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Спасибо всем за вклад.

Основной причиной является просто формат параметра Date, который некорректно работал на связанном сервере. Все, что мне нужно было сделать, это изменить свой запрос, чтобы использовать это:

SO_BOOK_DATE

вместо

SO_BOOK_DATE <'' @D ''. </strong>

0 голосов
/ 27 мая 2019

Во-первых, OPENQUERY требует, чтобы второй параметр был строкой запроса.Строка в SQL Server записана в одинарных кавычках.Из OPENQUERY документации :

OPENQUERY ( linked_server ,'query' ) 

Мало того, что SQL, который появляется в этой строке, должен иметь любые одинарные кавычки, которые появляются в запросе для удвоения.Предположим, у вас есть SQL, который вы хотите выполнить следующий запрос:

SELECT * FROM some_table WHERE name='TT.';

Вы бы написали это как:

OPENQUERY(lks,'SELECT * FROM some_table WHERE name=''TT.''')

Но если у вас есть это в динамическом операторе SQL, это станет

DECLARE @s VARCHAR(MAX);
SET @s='SELECT * FROM OPENQUERY(lks,''SELECT * FROM some_table WHERE name=''''TT.'''''')';

Итак, вот какой-то взрыв одиночных кавычек даже для самых тривиальных запросов SQL.Подсчитайте кавычки, убедитесь, что сам запрос не соответствует действительности (т. Е. Кавычки были правильно удвоены).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...