Программирование >>  Программирование баз данных 

1 ... 111 112 113 [ 114 ] 115 116 117 ... 346


Дополнительные операторы

Другие операторы, выполняемые, если выражение 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.



1 ... 111 112 113 [ 114 ] 115 116 117 ... 346

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика