|
Программирование >> Программирование баз данных
Оператор if else Операторы IF. . . ELSE действуют в языке T-SQL в основном так же, как и в любых других языках, но, по мнению автора, способ их реализации в большей степени напоминает реализацию в языке С. Эти операторы имеют следующий основной синтаксис: IF <Воо1еап Expression> <SQL statement> BEGIN <code series> END [ELSE <SQL statement> BEGIN <code series> END] В качестве булева выражения <Boolean Expression> может применяться практически любое выражение, результат вычисления которого представляет собой булево значение. При использовании оператора IF. . .ELSE также необходимо избегать одной из ловушек, в которые, по мнению автора, наиболее часто попадают программисты, работающие на языке SQL, - неправильное использование NULL-значений. Трудно представить себе, насколько часто приходится заниматься отладкой хранимых процедур, в результате которой обнаруживается такой оператор. IF@myvar = NULL Безусловно, выражение ©myvar = NULL никогда не может принять истинное значение в большинстве систем (из этюго правила есть исключения, о которых речь пойдет ниже), и в конечном итюге пропускаются все значения переменной ©myvar, равные NULL. Вместю этюго в качестве указантюго оператора следует иепользовать такую конструкцию: IF ©myvar IS NULL Следует учитывать, что NULL-значение ничему не равно, даже самому NULL-зна-чению. Поэтому вместо операции сравнения = следует использовать операцию IS. Необходимо отметить, что сказанное выше может оказаться правильным или неправильным в зависимости от того, присвоено ли опции конфигурации ANSI NULLS значение ON или OFF. По умолчанию эта функция имеет значение ON, и в таком случае проверка наличия NULL-значения с помощью оператора =, как уже было С1сазано, не допускается. Но возможность использовать для этого оператор = можно получить, задав значение опции ANSI NULLS, равное OFF. Тем не менее автор настоятельно рекомендует не делать этого, поскольку такое действие равносильно нарушению стандарта ANSI (а также просто приводит к получению неправильных результатов). Следует учитывать, что выполняемым по условию считается только тот оператор, который непосредственно следует за оператором IF (ближайшим к нему). Вместо одного оператора можно предусмотреть вьшолнение по условию нескольких операторов, включив их в состав блока управления процессом вьшолнения с помощью конструкции BEGIN. . .END (дополнительная информация на эту тему приведена ниже в данной главе). Чтобы ознакомиться с тем, как применяется эта конструкция, рассмотрим простой пример, который очень часто встречается при создании сценариев. Предположим, что необходимо создать таблицу с помощью оператора CREATE, если она еще не существует, если же таблица существует, оставить ее нетронгугой. Для этого можно было бы воспользоваться операцией EXISTS (как уже было сказано, в документации Books Online указано, что EXISTS - ключевое слово, но автор полагает, что это - операция). -- Вначале выполняется оператор SELECT, в котором предусмотрен доступ к рассматриваемой таблице, что позволяет убедиться в отсутствии этой таблицы SELECT Found Table + s.name + . + t.name FROM sys.schemas s JOIN sys.tables t ON s.schema id = t.schema id WHERE s.name = dbo AND t.name = OurlFTest -- После этого вызывается на выполнение условный оператор CREATE IF NOT EXISTS ( SELECT s.name AS SchemaName, t.name AS TableName FROM sys.schemas s JOIN sys.tables t ON s.schema id = t.schema id WHERE s.name = dbo AND t.name = OurlFTest ) CREATE TABLE OurlFTest( Coll int PRIMARY KEY -- Наконец, осуществляется еще одно обращение к таблице для демонстрации того, -- что она создана SELECT Found Table + s.name + . + t.name FROM sys.schemas s JOIN sys.tables t ON s.schema id = t.schema id WHERE s.name = dbo AND t.name = OurlFTest Операция проверки условия применяется непосредственно в самом операторе; обратите внимание на то, что оператор CREATE TABLE выполняется, только если таблица, указанная в проверяемом условии не существует. (О row(s) affected) Found Table dbo.OurlFTest (1 row(s) affected) Конструкция else Следует отметить, что возможность выполнения определенного оператора по условию является весьма привлекательной, но фактически одно лишь это средство управления ходом выполнения не позволяет справиться со всеми возможными ситуациями. При проверке условий оператора IF очень часто (а фактически чаще всего) возникает необходимость выполнить определенный ряд операторов, если результат проверки окажется истинным, а также отдельный ряд операторов, если результат будет ложным. В последнем случае может применяться конструкция ELSE. Иногда возникают ситуации, в которых результаты проверки не могут быть выражены в виде булева значения, т.е. результат неизвестен (например, если применяется сравнение с NULL-значением). Любые выражения, которые возвращают результат, рассматриваемый как неопределенный, считаются возвращающими значение FALSE. Конструкция ELSE оператора IF действует во многом аналогично тому, как и в других языках. При этом независимо от небольших различий в синтаксисе основное назначение этой конструкции остается одним и тем же - выполняются либо операторы в конструкции ELSE, либо операторы в конструкции IF. Чтобы немного дополнить приведенный выше пример, предусмотрим вывод предупреждающего сообщения в том случае, если таблица не будет создана: После этого вызывается на выполнение условный оператор CREATE IF NOT EXISTS { SELECT s.name AS SchemaName, t.name AS TableName FROM sys.schemas s JOIN sys.tables t ON s.schema id = t.schema id WHERE s.name = dbo AND t.name = OurlFTest ) CREATE TABLE OurlFTest{ Coll int PRIMARY KEY ELSE PRINT WARNING: Skipping CREATE as table already exists Если предьщущий пример уже был выполнен, то созданная в нем таблица существует, поэтому при выполнении второго примера должно быть получено следующее предупреждающее сообщение: WARNING: Skipping CREATE as table already exists Группирование кода в блоки Иногда возникает необходимость объединить группу операторов в блок, чтобы можно было рассматривать их как один оператор (и выполнять по условию либо все операторы блока, либо не выполнять ни одного из них). Например, синтаксическая конструкция оператора IF предусматривает вьшолнение по условию только одного оператора, а именно, того, который следует за ним. Но иногда возникает необходимость обеспечить вьшолнение по условию нескольких операторов. Безусловно, такой способ организации работы программы, при котором применяется отдельный оператор IF для каждой строки исходного кода, которая должна быть выполнена по условию, является полностью неприемлемым. К счастью, как в большинстве других языков, в которых предусмотрен оператор IF, в версии языка SQL, применяемой в СУБД SQL Server, определен способ группирования в блоки операторов, которые рассматриваются как единое целое. Определение блока начинается с конструкции BEGIN и включает в себя все следующие операторы вплоть до конструкции END. Ниже приведен пример сложного выражения, в котором используются блоки, состоящего из нескольких операторов IF. IF <Expressionl> BEGIN -- Начинается первый блок кода, который выполняется, только если выражеь1ие -- Expressionl имеет значение TRUE Операторы, которые выполняются, если выражение Expressionl имеет значение TRUE Дополнительные операторы Другие операторы, выполняемые, если выражение Expressionl имеет значение TRUE IF <Expression2> Выполняется, только если этот блок активен BEGIN Операторы, выполняемые, если выражение Expressionl и выражение Expression2 имеют значение TRUE
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |