|
Программирование >> Программирование баз данных
Дополнительные операторы Другие операторы, выполняемые, если выражение Expression2 Р1меет значение TRUE Операторы, выполняемые вне зависр1мости от результатов проверки выражения Expressionl END -- Этот оператор обозначает конец внешнего блока ELSE BEGIN Операторы, выполняемые, если выражение Expressionl имеет значение FALSE Дополнительные отераторы Другие операторы, выполняемые, если выражение Expressionl имеет значение FALSE Обратите внимание на то, что благодаря применению блоков появляется возможность создавать вложенные программные констр)тсции. Каждый внутренний блок должен быть полностью заключен во внешний блок. Автору еще не приходилось слышать о том, что есть какой-то предел глубины, на которую допускается вкладывать блоки BEGIN. . .END, но обязан порекомендовать, чтобы такое значение глубины вложенности не выходило за разумные рамки. Дело в том, что на практике код, в котором применяется слишком большая глубина вложенности, становится сложным для восприятия, причем исправить эту ситуацию не позволяет даже очень тщательное форматирование кода. Для проверки на практике того, как применяются блоки, рассмотрим еще один вариант сценария создания таблицы. Кроме того, в этом примере показано, как предусмотреть формирование информационного сообщения, независимо от того, была ли таблица создана пли нет. --На этот раз проводится дополнительная проверка для определения того, существует ли таблица. -- В случае положительного результата проверки таблица уничтожается, чтобы -- в остальной части прр1мера можно было проверить выполнение условия IF. -- Если же есть необходр1мость еще раз проверить работу приведенного ниже -- условия EXISTS, достаточно удалить первый блок IF ELSE IF 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 ) DROP TABLE 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 ) BEGIN PRINT Table dbo.OurlFTest not found. PRINT CREATING: Table dbo.OurlFTest CREATE TABLE OurlFTest{ Coll int PRIMARY KEY ) ELSE PRINT WARNING: Skipping CREATE as table already exists В этом примере можно ознакомиться со всеми вариантами применения оператора IF. В наиболее простой форме применяется лишь сам оператор IF, без конструкций BEGIN. . . END или ELSE. В другом варианте применения оператора IF предусмотрено использование в исполняемой части оператора IF блока BEGIN. . .END, но не конструкции ELSE. Очевидно, что приведенный пример является очень наглядной иллюстрацией иепользования различных вариантов уаювных операторов. Тем не менее на практике автор еще раз рекомендует соблюдать правило - придерживаться единообразия. Если в исходном коде для проверки условий постоянно применяются разнообразные варианты оператюров IF. , . ELSE, пю становится затруднительным изучение программы для определения тюго, какой оператор управляется с учетом тюго или иного условия. Поэтюму если какой-тю конкретный оператор IF сопровождается в иеходном коде определением блока BEGIN. . . END, то такие же блоки должны быть предусмотрены для всех операторов IF в программе, даже если в состав блока входит единственный оператор, выполняемый по условию. Оператор case Оператор CASE в определенном смысле эквивалентен нескольким разным операторам в различных процедурньгх языках программирования. К числу операторов процедурных языков программирования, которые действуют аналогично оператору CASE, относятся следующие: switch: С, С++, С#, Delphi; Select Case: Visual Basic; Do Case: XBase; Evaluate: COBOL. Автор знает о том, что есть также многие другие языки программирования с аналогичными конструкциями, а выше приведены примеры лишь из тех языков, с которыми ему довелось работать в течение многих лет. Реализация оператора CASE в языке T-SQL имеет один значительный недостаток, связанный с тем, что этот оператор в большей степени предназначен для подстановки значений, чем для управления процессом вьшолнения. Синтаксическая структура оператора CASE имеет две формы: с входным выражением или с булевым выражением. В первой форме используется входное выражение, которое сравнивается со значением, заданным в каждой из несколькР1х конструкций WHEN. В документации SQL Server оператор в этой форме именуется простым оператором CASE: CASE <input expression> WHEN <when expression> THEN <result expression> [...n] [ELSE <result expression>] END Во втором варианте синтаксической структуры в каждой конструкции WHEN должно быть предусмотрено выражение, вычисление которого приводит к получению значения TRUE или FALSE. В документации оператор в этой форме называется поисковым оператором CASE: CASE WHEN <Boolean expression> THEN <result expression> [...n] [ELSE <result expression>] END По-видимому, наиболее удобной особенностью оператора CASE является то, что он может использоваться как встроенный в оператор SELECT (т.е. может составить неотъемлемую часть указанного оператора). Благодаря этому с помощью оператора CASE можно создавать весьма мощные конструкции. Простой оператор case В основе простого оператора CASE лежит входное выражение, < input expres-sion>, вычисление которого приводит к получению однозначного результата. Сразу же перейдем к рассмотрению примера: USE AdventureWorks GO SELECT TOP 10 SalesOrderlD, SalesOrderlD % 10 AS Last Digit, Position = CASE SalesOrderlD % 10 WHEN 1 THEN First WHEN 2 THEN Second WHEN 3 THEN Third WHEN 4 THEN Fourth ELSE Something Else FROM Sales.SalesOrderHeader Напомним, что операция % представляет собой операцию деления по модулю. Операция деления по модулю применяется аналогично операции деления (/), но возвращает не частное и остаток, а только остаток, поэтому 16 % 4 = О (16 делится на 4 без остатка), а 16 % 5 = 1 (остаток от деления 16 на 5 равен 1). В рассматриваемом примере применяется деление по модулю на десять, поэтому выполнение данной операции приводит к получению последней цифры числа, используемого в качестве входных данньгх. Ниже приведены результаты, которые должны быть получены при выполнении этого примера кода. OrderlD Last Digit Position 10249 9 Something Else 10251 1 First 10258 8 Something Else 10260 0 Something Else 10265 5 Something Else 10267 7 Something Else 10269 9 Something Else 10270 0 Something Else 10274 4 Fourth 10275 5 Something Else (10 row(s) affected) Обратите внимание на то, что при обнаружении любого значения, соответствующего одному из указанных в списке, выполняется соответствующая конструкция THEN.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |