Пересортировка данных при запросе на linked server

При запросе на сервер Oracle через Oracle Provider for OLE DB (включен интерпроцессинг) результат запроса возвращается вперемешку (значения из clob).

  • На разных версиях Oracle 12,19,20
  • На разных версиях SQL Server и серверах
  • C OpenQuery и без него
  • Версия Oracle 12

Напрямую (sql developer) таких проблем нет


Ответы (1 шт):

Автор решения: Yitzhak Khabinsky

У существующего подхода есть две проблемы:

  • Весь набор данных переносится из Oracle в SQL Server как есть.
  • Фильтр предложения WHERE применяется на стороне SQL Server.

Лучший способ — использовать другой метод: EXECUTE ... AT [Linked Server]

Этот метод заставляет выполнять SELECT ... на стороне Oracle, а также даже передавать параметры для Oracle.

Вам придется изменить параметры @start и @end, поскольку Oracle ожидает их в формате, отличном от формата SQL Server. Вы можете протестировать формат параметров непосредственно со стороны Oracle. Возможно, используйте функцию Oracle to_date().

SQL

DECLARE @start DATETIME = DATEADD(HOUR, -3, (CAST(FLOOR(CAST(GETDATE() - 1 AS FLOAT)) AS DATETIME)));
DECLARE @end DATETIME = DATEADD(HOUR, -3, (CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)));

EXECUTE(N'SELECT ID,
       STARTDATE,
       ENDDATE,
       IDMAIN,
       COMMENT
FROM [DIR].[MAINDATA]
WHERE enddate >= ? AND enddate < ?
ORDER BY ...',
@start, @end) AT [LSTL2];
→ Ссылка