Включает режим совместимости SQL-заппросов для версий Visual FoxPro 7.0, 8.0, и 9.0.

SET ENGINEBEHAVIOR 70 | 80 | 90

Параметры

70

Включает режим совместимости команд SQL в системе Visual FoxPro как в версиях, ниже 8.0.
80

Определяет выполнение команд SQL для версии Visual FoxPro 8.0. в следующей таблице описаны особенности данного режима.

Опции     SQL SELECT  Поведение команды SELECT-SQL

DISTINCT

Вы не можете использовать опцию DISTINCT с полями типа Memo или General. Вместо этого используйте функции PADR( ) или ALLTRIM( ) для этих полей.

Дополнительно см.  Функции PADL( ) | PADR( ) | PADC( )  и функция ALLTRIM( ).

UNION

Опция UNION не поддерживается для полей типа Memo без предиката ALL, включенного в команду SQL SELECT.

GROUP BY

В опции GROUP BY должно быть указано поле из списка полей оператора SELECT , для которого выполняется агрегатная функция, такая как COUNT( ). Кроме того, опция GROUP BY должна содержать поле группировки, содержащееся в опции HAVING, исключая поля из агрегатных функций.

Например, следующая команда генерирует ошибку в опции GROUP BY , потому, что поле company не указано в группировке.

  Копировать код
SELECT company, country FROM Customer GROUP BY country

Вы можете включать агрегатные функции в список SELECT без указания их в опции GROUP BY.

Например, следующая команда использует COUNT( ) для поля company без указания его в опции GROUP BY .

SELECT COUNT(company), country FROM Customer GROUP BY country

HAVING

Оператор SQL SELECT может содержать опцию HAVING без ссылки на опцию GROUP BY , при этом в операторе SQL SELECT не должно быть агрегатных функций.

Например, следующая команда фильтрует запрос по заданной величине  "Sweden".

  Копировать код
SELECT customerid FROM customers HAVING country="Sweden"

LIKE

Оператор SQL SELECT автоматически не удаляет "хвостовые" пробелы для значений в конструкции LIKE. В предыдущей версии Visual FoxPro 7.0, в обеих переменных в конструкции LIKE, перед сравнением удалялись "хвостовые" пробелы .

Например, В следующей команде выбираются данные из таблицы, имеющей следующие значения в каждой из строк, соответственно:  "1.", "12 ", и "123".

  Копировать код
SELECT * FROM table1 WHERE column1 LIKE "1__"

В Visual FoxPro 7.0 и младших версиях в результате вернулась бы одна запись, со значением "123".  В Visual FoxPro 8.0 в результат попадают три записи: , "1 ", "12 ", и "123".

Если начальные символы совпадают, а следующие за ним удовлетворяют "маске",  и имеют фиксированную длину, то конструкция LIKE обеспечивает их включение в результат запроса, "Хвостовые" пробелы не отбрасываются

90

Определяет выполнение команд SQL в соответствие со стандартными требованиями версии Visual FoxPro 9.0       (По-умолчанию) . В следующей таблице описаны особенности применения оператора SQL SELECT.

Опции    SQL SELECT Поведение команды SQL-SELECT

TOP nExpr

Когда используется данная опция:  TOPnExpr[PERCENT] , команда SQL SELECT возвращает в результате не больше указанного количества записей: nExpr[PERCENT] . Дополнительно: SQL -средство в этом случае более эффективно использует доступную память и быстрее получает результат запроса, когда опция TOP указывается без ключевого слова PERCENT .

GROUP BY

Когда в запросе используется агрегатная функция, такая как  MAX( ),  и в команде SQL SELECT отсутствует конструкция GROUP BY , то записей в результате не будет,  Visual FoxPro поместит в результат одну запись, системная переменная  _TALLY будет = 1. В предыдущих версиях записей в результате не будет, _TALLY = 0.

ORDER BY

Команда SELECTDISTINCTORDER BY генерирует ошибку если в опции ORDER BY указывается поле, которое отсутствует в списке полей команды SELECT .

  Копировать код
CREATE CURSOR foo (f1 int, f2 int)
SELECT DISTINCT f1 FROM foo ORDER BY f2 INTO CURSOR res

HAVING

Команда SELECTDISTINCTHAVING генерирует ошибку если в опции HAVING указано поле, отсутствующее в списке команды SELECT.

  Копировать код
CREATE CURSOR foo (f1 int, f2 int)
SELECT DISTINCT f1 from foo HAVING f2>1 INTO CURSOR res

Комментарии

Действие команды SET ENGINEBEHAVIOR является глобальным.

Использование установки SET ENGINEBEHAVIOR = 70 может привести к неожиданным результатам при выполнении команды SQL SELECT с опциями DISTINCT и UNION для молей типа MEMO, а также при использовании опций GROUP BY ,  HAVING без указания конструкции GROUP BY, а также когда используется оператор сравнения LIKE .

Когда используется установка SET ENGINEBEHAVIOR = 70 или = 80, относительно опции TOP в команде SQL SELECT в результат запроса может попасть более чем  nExpr записей когда в команде также присутствует опция  ORDER BY. Например,  Вы задаете  nExpr=10. Если в таблице имеется более чем 10 записей с одинаковым значением поля группировки, которое указано в опции  ORDER BY , то в результате запроса будет  больше чем 10 записей.

См. также