SQL Server / Oracle Linked - ошибка Юлианской даты - PullRequest
0 голосов
/ 30 марта 2009

У меня есть клиент, у которого база данных SQL Server 2000 связана с базой данных Oracle 8i. Они имеют десятки представлений в базе данных SQL Server 2000, которые ссылаются на базу данных Oracle, часто с простым синтаксисом, таким как:

SELECT *
FROM  SERVER..DB.TABLE

Эти представления (и ссылки на них) работали на ГОДЫ без проблем. Неожиданно сегодня утром некоторые (но не все) из них выходят из строя со следующей ошибкой:

Server: Msg 7330, Level 16, State 2, Procedure SALES_ORDER_HEADERS, Line 7
Could not fetch a row from OLE DB provider 'MSDAORA'. 
[OLE/DB provider returned message: ORA-01854: julian date must be between 1 and 5373484]
OLE DB error trace [OLE/DB Provider 'MSDAORA' IRowset::GetNextRows returned 0x80040e07].

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

Моя компания не создавала систему, и мы в целом не поддерживаем ее - у клиента есть внутренняя команда разработчиков, которая работает над ней, но они попросили нашу помощь в устранении неполадок, и мы так же озадачены, как и они Я решил спросить здесь.

Кто-нибудь знает, почему мы увидим это поведение - и, что более важно, как его исправить? (За исключением обновления; на данный момент это не вариант.) В качестве временного обходного пути мы обнаружили, что использование OPENQUERY работает, но, конечно, это медлительно. Мы бы хотели решение, которое не включает OPENQUERY, если возможно.

В ответ на комментарии: ORDER BY не определено в представлениях. Может быть в sprocs, но я не уверен. (Я впервые увидел эту базу данных примерно за 20 минут до публикации вопроса. :))

Ответы [ 2 ]

2 голосов
/ 31 марта 2009

Я думаю, что произошли изменения в данных, которые произошли не годами. Несколько лет назад я обнаружил нечто похожее, я разрабатывал критически важный модуль приложения, тестировал, тестировал, тестировал для множества вариантов использования и все в порядке, и в тот день, когда был запущен производственный процесс, был введен непроверенный шаблон! Невероятно, но это правда!

Поскольку это изменение данных что-то не так, это вызывает какой-то вызов TO_CHAR(xx, 'J'). Например, ноль или отрицательные данные.

Из-за падения количества вызовов может быть общая таблица / столбец, общий для всех.

Действия:

  • Активируйте trace для сеанса в Oracle (вы можете сделать это для активного сеанса и для номера ошибки).
  • Найдите таблицы / столбцы с общим знаменателем, а затем странные значения.
0 голосов
/ 30 марта 2009

Есть ли в ваших взглядах "ЗАКАЗАТЬ", это может быть причиной.

...