SQL: OPENQUERY Не возвращает все строки - PullRequest
4 голосов
/ 15 декабря 2010

У меня есть следующее, которое запрашивает связанный сервер, с которым мне нужно поговорить.

SELECT * FROM

OPENQUERY (DWH_LINK, 'SELECT * FROM TABLEA')

Как правило, он возвращает большинство данных, но некоторые строки отсутствуют?

Связанный сервер поступает от клиента-оракула

С этой проблемой кто-нибудь сталкивался с помощью openquery?

Ответы [ 4 ]

4 голосов
/ 13 апреля 2011

У меня была точно такая же проблема.

Основной причиной является то, что вы настроили связанный сервер, используя ODBC вместо OLE DB.

Вот как я это исправил:

  • Удалить связанный сервер из SQL Server
  • Щелкните правой кнопкой мыши папку «Связанные серверы» и выберите «Новый связанный сервер ...»
  • Связанный сервер: введите что угодно .. это будет имя вашего нового связанного сервера
    • Поставщик: выберите «Поставщик Oracle для OLE DB»
    • Наименование продукта: введите "Oracle" (без двойных кавычек)
    • Источник данных: введите псевдоним из вашего файла TNSNAMES.ORA. В моем случае это был «ABC.WORLD» (без двойных кавычек)
    • Строка поставщика: оставьте поле пустым
    • Местоположение: оставьте пустым
    • Каталог: оставьте пустым

Теперь перейдите на вкладку «Безопасность» и нажмите последнюю кнопку с надписью «Сделайте, используя этот контекст безопасности:» и введите имя пользователя и пароль для вашего подключения

Так и должно быть!

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

У меня была точно такая же проблема с SQL 2014, получающим данные из SQL 2000 через OPENQUERY. Поскольку проблема совместимости с ODBC, мне пришлось сохранить общий OLE DB для драйвера ODBC. Более того, проблема была только с учетной записью без прав администратора SQL. Итак, наконец, решение, которое я нашел, было добавить SET ROWCOUNT 0:

SELECT * FROM OPENQUERY(DWH_LINK, 'SET ROWCOUNT 0 SELECT * FROM TABLEA ')

Кажется, что число строк могло быть изменено где-то с помощью процедуры SQL (или для этого пользовательского сеанса), поэтому установка его в 0 заставляет его возвращать "все строки".

0 голосов
/ 31 декабря 2013

У меня была такая же проблема при использовании клиента мгновенного доступа Oracle 10 и ODBC.Я использовал этот клиент при подключении к базе данных Oracle 10gR2.Я открыл заявку с поддержкой Microsoft, и они предложили использовать мгновенный клиент Oracle 11.Сюрприз!Удаление мгновенного клиента 10g, установка мгновенного клиента 11g и перезагрузка решили проблему.

Ken

0 голосов
/ 13 марта 2011

Похоже, это связано с возможностями базового провайдера, и другие также сталкивались с этим и аналогичными ограничениями размера / строки. Одним из возможных обходных путей может быть реализация итеративного / циклического запроса с некоторой встроенной фильтрацией, чтобы отбросить определенное количество строк. С оракулом, я думаю, что это может быть использование rownum (не очень знаком с оракулом).

Так что-то вроде

--Not tested sql, just winging it syntax-wise
SELECT * FROM OPENQUERY(DWH_LINK, 'SELECT * FROM TABLEA where rownum between 0 AND 500')
SELECT * FROM OPENQUERY(DWH_LINK, 'SELECT * FROM TABLEA where rownum between 500 AND 1000')
SELECT * FROM OPENQUERY(DWH_LINK, 'SELECT * FROM TABLEA where rownum ...')

BOL: ссылка Это зависит от возможностей поставщика OLE DB. Хотя запрос может вернуть несколько наборов результатов, OPENQUERY возвращает только первый.

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