Личен сайт - Типични спирачки за заявка
Предметът на тази статия са често срещани грешки, които водят до лошо изпълнение на заявките.
Предполагаме, че вашите таблици съдържат първични ключове, външни ключове и индекси в полетата, които се търсят и сортират.
JET/ACE (Access Query Engine) използва Структуриран език за заявки (SQL), както много бази данни. JET също може да извиква код на Visual Basic for Applications (VBA). Това коренно разширява възможностите на JET, но повикването VBA губи значението си, ако работата може да бъде извършена от SQL.
Е Null, не IsNull ()
Е нула е естествен SQL израз.
IsNull () - Извикване на функция VBA.
Няма основателна причина да извикате IsNull () в заявка, тъй като SQL може независимо да оцени значението на израза.
Функцията Nz () замества Null с друга стойност (за числа, обикновено нула, за текст - празен низ.) Новата стойност е тип данни Variant и VBA я маркира с подтип: String, Long, Double, Date, и т.н.
Във VBA това е чудесно: функция може да върне различни подтипове в различни ситуации. Но в заявка колона може да бъде само от ЕДИН тип данни. Следователно JET третира стойностите на Variant като текстови стойности, тъй като всичко (числа, дати, знаци,.) Е валидно в текстова колона.
Визуална улика, че JET третира колоната като текст, подравнен вляво. Номерата и датите се показват вдясно.
Ако сте очаквали числова колона или колона с дата, имате сериозни проблеми. Текстовите полета се оценяват знак по знак. Тези. 2 е по-голямо от 19, тъй като първият знак (2) е по-голям от първия символ в друг текст (1 от 19.) По същия начин 4/1/2009 идва след 1/1/2010 в текстовата колона, тъй като 4 идва след 1.
Звънецът звъни, когато видите колона, подравнена вляво като текст, когато сте очаквали тя да бъде третирана като число. Записите ще бъдат избрани неправилно и сортирането ще изглежда безсмислено.
Би било възможно да напишете израза, като извикате друга функция на VBA, но по-добро решение би било да оставите JET да свърши работата, без изобщо да извиква VBA.
Вместо:
Nz (MyField, 0)
използване:
IIf (MyField е Null, 0, MyField)
Да, трябва да отпечатате малко повече, но има предимства:
- Избягвате да извиквате функцията Nz ().
- Вие съхранявате желания тип данни.
- Критериите се прилагат правилно.
- Колоната се сортира правилно.
Този принцип се прилага не само за Nz (), но и за всяка функция на VBA, която връща вариант. Just Nz () е най-често срещаният случай.
(Обърнете внимание, че функцията JET IIf () е много по-ефективна от функцията VBA със същото име. Функцията VBA прекарва време в оценка както на истинските, така и на фалшивите части и генерира грешки, ако някоя от частите се провали (дори ако тази част не е функцията IIf () на JET няма такъв проблем.)
Доменни агрегатни функции
DLookup (), DSum () и др. - бавно при изпълнение на функцията. Те изискват VBA повикване, обаждане до Expression Service и консумират ресурси (отваряне на допълнителни връзки към файла с данни). Всичко се забавя особено, ако JET трябва да извърши операция на всеки ред от заявката.