Ошибка Sybase 12.5-BDE-ADO, где myColumn = null - PullRequest
3 голосов
/ 12 декабря 2011

У нас есть старое приложение, которое читает текстовые файлы SQL и отправляет их в Sybase ASE 12.51.Наше унаследованное приложение было написано на Delphi 5 и использует для этого процесс компонент BDE TQuery и доступ к Sybase с помощью BDE SQLinks для Sybase.

Псевдокод:

SQLText=readSQLFile;
aTQuery.SQL.add(SQLText);
aTQuery.ExecSQL;

Недавно мы переместили нашУровень доступа к БД для реализации ADO в Delphi XE - TADOQuery, использующий поставщика ADO, поставляемого Sybase, по-прежнему использует ту же модель:

SQLText=readSQLFile;
aTADOQuery.SQL.add(SQLText)
aTADOQuery.ExecSQL;

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

Select myColumn from myTable 
Where  tranID = null

Зная, что эта конструкция в лучшем случае подвергается сомнению, я сделал двойной подход, когда увидел этот код, но Sybase 12.5 принимает его - однако с использованием ADOэтот сегмент не работает.

Мы решили изменить:

Where  tranID = null

на

Where  tranID is null

Затем были загружены недостающие данные - проблема решена, для этого сегмента и некоторых других.

У кого-нибудь есть объяснение этому поведению?Где / почему ADO, очевидно, перехватывал и отклонял этот сегмент, тогда как BDE проходил через него?

TIA

1 Ответ

3 голосов
/ 13 декабря 2011

«NULL» имеет особое значение, а SQL требует особой обработки. Вы не можете сравнить значение с «NULL», поэтому есть специальный оператор IS (NOT) NULL, чтобы проверить его. Исчерпывающее объяснение заняло бы некоторое место, здесь простое объяснение.

С "математической" точки зрения NULL можно рассматривать как "бесконечность". Вы не можете легко сравнить два бесконечных значения, например, подумайте о наборе целых чисел и даже чисел. Оба бесконечны, но кажется логичным, что первое больше второго. Все, что вы можете сказать, это то, что оба множества бесконечны.

Это также помогает объяснить, например, почему 1 + NULL возвращает NULL и т. Д. (Обычно только агрегатные функции, такие как SUM () и т. Д. Могут игнорировать значения NULL - игнорировать, а не превращать NULL в нули).

Эта метафора может не соответствовать действительности при сортировке, поскольку некоторые базы данных предпочитают считать NULL меньше любого значения (некоторый вид -infinity и, таким образом, возвращать их сначала в порядке возрастания), а наоборот. У некоторых есть возможность указать, где возвращать NULL.

Проверьте документацию базы данных об NULL-арифметике и сравнениях NULL. field = NULL никогда не должен был использоваться, не знаю, принимает ли его Sybase, но большинство реализаций SQL этого не делают, и я предполагаю, что он не соответствует стандартам SQL. Гораздо лучше привыкнуть к синтаксису IS (NOT) NULL.

Обновление : Sybase имеет опцию "set ansinull" из документации (всегда RTFM!), В 12.5.1 она была расширена для запрета синтаксиса '= NULL' (если установлено значение ON, чтобы сделать его совместимым со стандартами SQL). При значении OFF '= NULL' работает как 'IS NULL'.

Возможно, SQL Links или провайдер ADO установили одно или другое значение.

...