авторефераты диссертаций БЕСПЛАТНАЯ БИБЛИОТЕКА РОССИИ

КОНФЕРЕНЦИИ, КНИГИ, ПОСОБИЯ, НАУЧНЫЕ ИЗДАНИЯ

<< ГЛАВНАЯ
АГРОИНЖЕНЕРИЯ
АСТРОНОМИЯ
БЕЗОПАСНОСТЬ
БИОЛОГИЯ
ЗЕМЛЯ
ИНФОРМАТИКА
ИСКУССТВОВЕДЕНИЕ
ИСТОРИЯ
КУЛЬТУРОЛОГИЯ
МАШИНОСТРОЕНИЕ
МЕДИЦИНА
МЕТАЛЛУРГИЯ
МЕХАНИКА
ПЕДАГОГИКА
ПОЛИТИКА
ПРИБОРОСТРОЕНИЕ
ПРОДОВОЛЬСТВИЕ
ПСИХОЛОГИЯ
РАДИОТЕХНИКА
СЕЛЬСКОЕ ХОЗЯЙСТВО
СОЦИОЛОГИЯ
СТРОИТЕЛЬСТВО
ТЕХНИЧЕСКИЕ НАУКИ
ТРАНСПОРТ
ФАРМАЦЕВТИКА
ФИЗИКА
ФИЗИОЛОГИЯ
ФИЛОЛОГИЯ
ФИЛОСОФИЯ
ХИМИЯ
ЭКОНОМИКА
ЭЛЕКТРОТЕХНИКА
ЭНЕРГЕТИКА
ЮРИСПРУДЕНЦИЯ
ЯЗЫКОЗНАНИЕ
РАЗНОЕ
КОНТАКТЫ


Pages:     | 1 |   ...   | 27 | 28 || 30 | 31 |   ...   | 33 |

«Е.Мамаев MS SQL SERVER 2000 Книга посвящена одной из самых мощных и популярных современных систем управления базами данных - Microsoft SQL Server 2000. ...»

-- [ Страница 29 ] --

О Константы (constants). Это постоянные величины, значения которых задают ся на этапе написания кода и не могут быть изменены в ходе выполнения Глава 25. Основы Transact-SQL программы. Например, в выражении 3+l2.52*@vari константами являются И 12.52. Другие примеры КОНСТаНТ: ' P a v e l S i p k i n ', 0x254 62 9 И NULL. В приведенном ниже примере переменной evari присваивается результат вы числения суммы чисел 17,83 и -5,62, умноженный на 0,78. Значение пере менной затем выводится на экран:

DECLARE @Varl decimal (10,2) SET @Varl = (-5.62+17.831*0. SELECT @Varl Будет выведен следующий результат:

Часть V. Программирование В^езультате^ёыполнения будет выведено следующее сообщение:

2G0O-05-O1 '• 11-: 15:13.330 Sipkin молодец!

(1 row(s)' a f f e c t e d ) • Имя столбца (column name). При использовании выражений в командах ска нирования (DELETE, UPDATE ИЛИ SELECT) В качестве операндов можно указы вать имена столбцов сканируемых таблиц, которые могут задаваться как в конструкции WHERE для ограничения диапазона сканируемых строк, так и в списке выбираемых значений. При сканировании таблицы последовательно вместо имени столбца будет подставляться значение, соответствующее кон кретной строке таблицы. Таким образом, с помощью имени столбца можно обратиться к каждой строке сканируемой таблицы. В приведенном ниже примере выполняется сканирование таблицы authors. С помощью команды SELECT выводится 5 первых авторов, живущих в штате Калифорния:

USE pubs SELECT TOP 5 au_fname+' живет в Калифорнии в городе '+city FROM authors WHERE state='CA' После выполнения команды будет выведен примерно следующий результат Johnson живет в Калифорнии в городе Menlo Park Marjorie живет в Калифорнии в городе Oakland Cheryl живет в Калифорнии в городе Berkeley Michael живет в Калифорнии в городе San Jose Dean живет в Калифорнии в городе Oakland (5 row(s) affected) Другой пример иллюстрирует использование имени столбца для присвоения значения переменной. Приведенная ниже команда подсчитывает, на какую сумму было продано книг за год. Для этого она сканирует таблицу t i t l e s, перемножает столбцы p r i c e и y t d s a l e s и добавляет полученное значение к переменной @varl.

DECLARE @Varl money SET @Varl= SELECT @Varl=price*ytd^sales FROM titles •, SELECT @Varl В итоге будет выведен следующий результат:

Глава 25. Основы Transact-SQL _ применяются для возвращения набора строк с одним единственным столб цом. Такие наборы могут использоваться логическими операторами, работа с которыми будет рассмотрена в следующем разделе. В качестве примера при ведем запрос, выводящий названия всех книг, авторы которых проживают не в штате Калифорния:

SELECT title FROM titles WHERE title_ID IN ( SELECT title_id FROM authors, titleauthor WHERE titleauthor.au_id=authors.au_id AND state != 'CAM После выполнения запроса будет выведен следующий результат:

Title Silicon Valley Gastronomic Treats The Gourmet Microwave Is Anger the Enemy?

Life Without Fear Onions, Leeks, and Garlic: Cooking Secrets of the Mediterranean Fifty Years in Buckingham Palace Kitchens (6 row(s) affected) Подзапросы, возвращающие единственное значение, могут применяться в выражениях наравне с обычными переменными и константами:

DECLARE @Varl money SET @Varl = 10*(SELECT MAX(price) FROM titles) SELECT @Varl Будет возвращен следующий результат:

Warning: Null value eliminated by aggregate or other set operation.

1066 Часть V. Программирование Функция CASE Сначала рассмотрим использование функции CASE, имеющей следующий синтаксис:

CASE input_expression WHEN when_expression THEN result_expression [.n..] [ELSE else_result_expression] END Аргумент input_expression указывает выражение, которое будет определять возвращаемое функцией CASE значение. В выражении могут быть использованы любые из перечисленных операндов и операторов, которые будут рассмотрены в следующем разделе. После ключевого слова WHEN приводится выражение, при совпадении значения которого со значением входного выражения m p u t e x p r e s s i o n будет возвращено значение выражения resuit_expression, указываемое за ключевым словом THEN. Конструкция [...п] говорит о том, что может быть указано множество условий совпадения. После ключевого слова ELSE задается выражение (else_result_expression), значение которого должно быть возвращено при несоблюдении ни одного из описанных условий.

Глава 25. Основы Transact-SQL столбце s t a t e равно 'UT';

значение 'живет в Канзасе 1 ДЛЯ 'К&,1;

'живет в Ин диане' для ' I N 1 ;

значение 'живет в минессоте 1 для ' M I 1 и значение 'живет непонятно где' для всех других значений в столбце s t a t e. Кроме того, не вы водятся авторы, проживающие в Калифорнии.

SELECT au_lname+' живет '+CASE state WHEN 'UT1 THEN 'в Юте' WHEN 'KS' THEN 'в Канзасе' WHEN 'IN' THEN 'в Индиане' WHEN 'MI' THEN 'в Минессоте' ELSE 'непонятно где' END FROM authors WHERE state != 'CA' Результатом выполнения запроса будет следующий вывод:

Smith живет в Канзасе Greene живет непонятно где Blotchet-Halls живет непонятно где del Castillo живет в Минессоте DeFrance живет в Индиане Panteley живет непонятно где Ringer живет в Юте Ringer живет в Юте (8 row(s) affected) Описанный вариант команды CASE позволяет работать только строго с перечис ленными вариантами. Однако часто бывает необходимо получить значение на ос нове логического условия. Например, на основе количества лет, исполнившихся человеку, следует выдать его статус: младенец, если до 1 года;

ребенок до 10 лет, подросток до 15 лет, молодой человек до 27 лет, взрослый человек до 65 лет и старик в остальных случаях. Это разложение сложно сделать с помощью описан ного варианта функции CASE. МОЖНО воспользоваться командой I F, однако это потребует указания множества команд. Кроме того, применение команды IF не допустимо в выражениях. Выходом будет использование второго варианта функ ции CASE, так называемая поисковая функция CASE (search CASE function):

CASE WHEN Boolean_expression THEN result_expression [.].л [ELSE e l s e _ r e s u l t _ e x p r e s s i o n ] END Как видно из синтаксиса, значение, которое будет возвращено функцией CASE, зависит от выполнения логического условия, задаваемого с помощью аргумента Booiean_expression, и указывается после ключевого слова WHEN. После ключе вого слова THEN задается выражение ( r e s u i t e x p r e s s i o n ), значение которого будет возвращено при выполнении соответствующего логического условия. Хотя может проверяться множество логических условий, будет возвращено значение, соответствующее первому выполняемому условию.

Описанная задача с определением статуса человека может быть теперь легко решена:

1068 Часть V. Программирование DECLARE, Varl smalluatetime, @Vax2 int...,;

,.,...

SET @Var 1 = 4 3 aug 1978' SET @Var2=DATEDIFF(yy, SVarl, GETDATEO)/ SELECT @Var2, CASE WHEN @Var2l THEN 'младенец' WHEN @Var210 THEN 'ребенок' WHEN @Var215 THEN 'подросток' WHEN @Var227 THEN 'молодой человек' WHEN @Var265 THEN 'взрослый человек' ELSE 'старик' END В приведенном примере в переменную @Vari заносится дата рождения человека, а в переменную @var2 — динамически вычисляемое количество лет, исполнив шееся человеку. Хотя в нашем случае дата рождения была указана явно, она также может извлекаться из столбца таблицы. Итогом выполнения будет сле дующий результат:

Глава 25. Основы Transact-SQL с помощью функции CASE, возвращающей три разных результата: 'по штату ка лифорния' если значение столбца s t a t e равно ' С А ;

'ПО имени' если именем ав тора является 'Meander', 'Morningstar' ИЛИ 'Michel'. Значение 'все остальное' возвращается для всех строк, для которых не выполняется ни одно из перечис ленных условий. Можно выполнить этот запрос для наглядности отдельно:

SELECT au_fname, s t a t e, CASE W E state='CA' THEN 'по штату Калифорния' HN W E au_fname IN ('Meander', 'Morningstar', 'Michel') THEN 'по имени' HN ELSE 'все остальное END F O authors RM Будет получен следующий результат:

аи fname state (23 row(s) affected) Функция COALESCE Функция COALESCE предназначена для возвращения значения первого выраже ния из заданного списка, которое не равно NULL. В анализируемом выражении могут использоваться имена столбцов, переменные, константы, функции и т. д.

Синтаксис функции COALESCE таков:

COALESCE (expression [,..л]) Аргумент expression определяет выражение, которое будет анализироваться.

Конструкция [,...п] указывает, что в одной команде COALESCE МОЖНО задавать 1070 Часть V. Программирование множество выражений. Рассмотрим простейший пример использования коман ды COALESCE:

DECLARE @Varl int, @Var2 int, @Var3 int SET @Var2= SELECT COALESCE (@Varl,@Var2,@Var3) SET @Varl= SELECT COALESCE (SVarl, @Var2,@Var3) После выполнения команд будет выведен следующий результат:

Глава 25. Основы Transact-SQL 1072 Часть V. Программирование Операторы В предыдущих разделах были рассмотрены операнды, которые могут быть ис пользованы в выражениях. Однако сами по себе операнды не представляют осо бого интереса. Для получения полноценного выражения над операндами необ ходимо произвести какие-либо действия. Простейшим примером таких дейст вий могут служить арифметические операции, конкатенация строк, операции сравнения и т. д. Действия, производимые над операндами, задаются с помо щью операторов.

Операторы Transact-SQL делятся на следующие типы:

• простейшие, или унарные (unary);

О присваивания (assignment);

П арифметические (arithmetic);

О конкатенации строк (string concatenation);

• сравнения (comparison);

• битовые (bitwise);

• логические (logical).

Каждый из перечисленных типов операторов представляет определенный инте рес и обладает своей спецификой.

Простейшие операторы Простейшие операторы применяются к единственному выражению любого из числовых типов данных. В качестве выражения может выступать отдельная кон станта, переменная, функция или любая их комбинация, возвращающая число вое значение.

К простейшим относятся следующие операторы:

П + (Positive). Возвращает положительное значение числа. Можно рассматри вать как умножение операнда на +1. Использование этого оператора в боль шинстве случаев необязательно, т. к. по умолчанию, если явно не указан знак числа, то подразумевается, что число положительное. Использование оператора + для отрицательных значений не дает никакого результата.

• - (Negative). Возвращает отрицательное значение числа. Можно рассматри вать как умножение операнда на —1.

• ~ (Bitwise NOT). Возвращает значение, являющееся результатом побитового отрицания. Этот тип оператора также может быть с успехом отнесен к бито вым операторам.

Приведенный ниже пример демонстрирует работу простейших операторов:

SELECT +12.345, ~7, - 1 3. 3, + - 3, - + б, Будет получен следующий результат:

1 2. 3 4 5. ' - 8..-•;

• ;

. т 1 3. 3., - 3,;

;

ч. •. - 6,.••-.., 2, ( 1 r o w ( s ) a f f e c t e d )... ;

j l.. :,.-_, v,,-.

.•• С Замечание;

У ?,,-;

:,....,,.. :, Не нужно путать простейшие операторы с арифметическими операторами. Хотя они и записываются одинаково, все.же они различны. Однако, если посмотреть с другой стороны, то простейшие операторы являются облегченным вариантом арифметиче ских (+ и -) или битовых (-) операторов, первый из операндов которых равен 0. На пример, выражение -7 можно зйпйсать как 0-7.

Оператор присваивания В Transact-SQL существует единственный оператор присваивания — знак =. Этот оператор служит для присваивания знамений переменным и для связывания имен столбцов, возвращаемых командой SELECT, С определенным выражением.

Мы уже использовали оператор присваивания в предыдущих примерах. Тем не менее, рассмотрим отдельно его применение для присваивания значений пере менной:

D E C L A R E @ V a r l n v a r c h a r ( Ш г @Var2:,int..... :

S E T @Varl='Pavel Sipkin1........

SET @Var2=(12+5*-27)/ Следующий пример иллюстрирует использование,оп,ератора присваивания при выборке данных для определения имени столбца:

SELECT 'title-, 'Value'=pri'ce*yt;

d_s:aies FROM titles WHERE type=' business ' Будет выведен следующий результат:,, title Value The Busy Executive's Database Guide" - • ' : :«;

• ••• '81859. Cpokipjg wi_th,Conputers,::S.urp(epti,^ipus, Balance. Sheets.: 46318. You Can Combat Computer'stress! " ' '\ '.' 55978. S t r a i g h t " f a W :

- A b o u t ^ t f o m p u t f e s ' ' '" ":: '";

' ' '';

' 81859.0500' • N ro\i(s): atfebtid)'- • •t-''-.i" ' ' ".r- * " -/;

;

- ••••' *i ••'• • ' • ••'- '• ;

x ••!".•!»•'.. i •' -.'• : • -. '... ' •, :. ' • • • ' -. ' - ' • • '. } " • :, " \ \- "-,''..' ••"': Как видно из возвращенного результата, был роздан новый столбец с именем value, в котором находится итоговая сумма, полученная от реализации каждой книги серии 'BiisifeesS "Э^асййд^Йннвм -Примере' новый столбец был создан на основе произведения значений двух других столбцов. Однако допускается ис польдфваиие. не, только? чменг,н:трл^рв..та^л*а|ы.,;

,до и- переменных, констант, ФУНКЦИЙ»^ОДЗаПрОСОВц КОМаНД CAS^^SNUjLL^.COALbSCE И Т. Д., ( Замечание } Знак = может быть также использован как оператор сравнения для проверки двух величин на равенство.

35* 1074 Часть V. Программирование Арифметические операторы Операторы этого типа предназначены для выполнения стандартных арифмети ческих операций над двумя выражениями числового типа. К арифметическим относятся следующие операторы:

• Сложение (Add) — +. Этот оператор может использоваться не только для чи словых ТИПОВ, НО И ДЛЯ данных типа datetime И smalldatetime ДЛЯ добавле ния определенного количества дней. Количество дней задается с помощью числового выражения, возможно и нецелочисленного.

О Вычитание (Subtract) — —. Как и предыдущий оператор, вычитание может также быть применено к типам данных datetime и smalldatetime для вычи тания определенного количества дней. Количество дней задается с помощью числового выражения, возможно и нецелочисленного.

О Умножение (Multiply) — *. Этот оператор применяется для любых числовых ТИПОВ данных, исключая ТИПЫ данных datetime И smalldatetime.

• Деление (Divide) — /. Этот оператор применяется для любых числовых типов данных, исключая ТИПЫ данных datetime И smalldatetime.

П Остаток от деления (Modulo) — %. Этот оператор применяется для любых Ч С О Ы ТИПОВ данных, исключая ТИПЫ данных datetime, smalldatetime, ИЛВ Х money И smallmoney.

В качестве числовых типов данных арифметические операторы также рассмат ривают и типы данных money, smallmoney и binary. Приведенный ниже пример иллюстрирует использование оператора сложения для типа данных datetime:

DECLARE SVarl d a t e t i m e, @Var2 d a t e t i m e SET @Varl=GETDATE() SET @Var2=@Varl+1. SELECT 'нач. знач'=@Уаг1, 'конеч. знач'=@Уаг Будет получен следующий результат:

нач. знач конеч. знач 2000-05-01 19:38:51.663 2000-05-02 22:38:51. (1 row(s) affected) Рассмотрим работу арифметических операторов для типа данных money:

DECLARE gVarl money SET @Varl=$123. SELECT @Varl, @Varl*2, 6Varl+17.25, @Varl/ Будет получен следующий результат:

123.2500 246.5000 140.5000 24. (1 row(s) affected) »

Арифметические операторы также могут быть использованы для двоичных дан ных:

Глава 25. Основы Transact-SQL DECLARE @Varl b i n a r y ( 2 )...

SET @Varl=OxlOFl SELECT @Varl, @Varl+O, @Varl%7, @Varl+83, @Varl* Будет получен следующий результат:

OxlOFl 4337 4 4420 (1 row(s) affected) Оператор конкатенации строк Это единственный оператор помимо операторов сравнения и присваивания, ко торый используется для работы с текстовыми строками. Оператор конкатенации строк обозначается символом + аналогично арифметическому оператору сложе ния и простейшему оператору + (Positive).

Рассмотрим пример конкатенации двух строк:

DECLARE @Varl nvarchar(15), @Var2 nvarchar(15) SET @Varl='Pavel SET §Var2='Sipkin' SELECT @Varl+' '+@var2+' - правильный' Будет получен следующий результат:

Pavel Sipkin - правильный (1 row(s) affected) C~ Замечание ) Все другие операции с текстовыми значениями выполняются с помощью строковых функций. Например, для удаления всех конечных пробелов служит функция R T R I M, а для возвращения подстроки — функция S U B S T R I N G.

Операторы сравнения Операторы сравнения существуют для проверки выражения на соответствие оп ределенному условию. Такая проверка используется в командах I F, CASE конст рукции WHERE и в некоторых других случаях. В Transact-SQL имеются следую щие операторы сравнения:

• равнозначны (Equals) — =;

П больше чем (Greater than) — ;

• меньше чем (Less than) — ;

О больше чем или равно (Greater than or Equal to) — =;

П меньше чем или равно (Less than or Equal to) — =;

•I не равно (Not Equal to) — о или ! =;

1076 Часть V. Программирование О не меньше чем (Not Less than) — !;

• не больше чем (Not Greater than) — !. • Операторы сравнения указываются между двумя выражениями и определяют логическое условие, по которому сравниваются эти выражения. Результатом выполнения оператора сравнения является логическая величина, которая может иметь два состояния: TRUE — если условие выполняется, и FALSE — если условие не выполняется.

С Замечание ^ В некоторых языках программирования имеется специальный тип переменной — ло гический, который может быть использован для хранения значений T R U E И F A L S E.

Эти значения разрешается использовать непосредственно в командах, требующих возвращения логического значения ( I F, CASE, WHERE И Т. Д.). Однако в Transact-SQL нет типа данных, обеспечивающего хранение логических значений. Тем не менее, приложив небольшие усилия, для этих целей можно выбрать любой тип данных, на пример b i t.

В некоторых из предыдущих примеров уже были использованы операторы срав нения. Например, при работе со вторым вариантом команды CASE использова ние операторов сравнения обязательно. Рассмотрим использование операторов сравнения в команде I F :

IF DATEPART(hh, GETDATE())12 SELECT 'Вторая половина дня ELSE SELECT 'Перваячполовина дня' Операторы сравнения также активно применяются в конструкции WHERE команд сканирования для ограничения диапазона строк. Рассмотрим работу оператора сравнения для выборки данных с помощью команды SELECT:

SELECT au_fnante, phone, address F O authors W E E contract= RM HR Будет возвращен следующий результат:

phone address au_fname 913 843-0462 10 Mississippi Dr.

Meander 22 Graybar House Rd.

Morningstar 615 297- 415 843-2991 5420 Telegraph Av.

Dirk 448-4982 301 Putnam Heather (4 row(s) affected) Другой пример оператора сравнения:

SELECT t i t l e, type, [Итого сумма]=price * ytd_sales F O t i t l e s RM W E E price=19.99 A D advance!=5000 A D ytd_sales! HR N N Будет возвращен следующий результат:

type Итого сумма title But Is It User Friendly? popular_comp 201501. Secrets of Silicon Valley popular_comp 81900. (2 row(s) affected) ГпШ25, Основы Ttansaei-SQL ( Замечание ^ •• •;

:•••;

.•.,.••:.;

-;

...•.;

•.•••.., •;

.

Последние два примера иллюстрируют использование операторов сравнения при ••, выборке данных. Однако щл с успехом используются при обновлении ( U P D A T E ) И, удалении.(ощьЕТЕ} строк таблиц. ;

: •..• Битовые операторы Этот тип операторов предназначен для проведения побитовых операций над целочисленными значениями. Битовые операторы указываются между двумя целочисленными выражениями, В Transaet-SQL могут использоваться приве денные ниже битовые операторы;

;

• Битовое "И" (Bitwise AND) — &. Если каждый из соответствующих битов обоих выражений равен,1, то лдответетвующий бит возвращаемого значения будет равен 1. Во всех остальных случаях соответствующий бит результата ус танавливается в 0.

• Битовое "ИЛИ" (Bitwise OR) — |. Если хотя бы один из соответствующих битов любого из выражений рдвен 1, то в возвращаемом значении соответст вующий бит также будет равен,,1. Только когда каждый из соответствующих битов будет равен 0, то в итоговом значении бит устанавливается в 0.

О Битовое исключающее ИЛИ (Bitwise Exclusive OR, XOR) — л. Если соответ ствующие биты равны, то в возвращаемом значении соответствующий бит будет установлен в 0. В остальных случаях бит устанавливается в 1.

Выражения, участвующие в битовых операциях, могут быть типа данных i n t (4 байта), s m a l l i n t (2 байта), t i n y i n t (1 байт), b i n a r y (до 8 КБайт), varbinary (до 8 КБайт) и b i t (1 бит). Однако только один из операндов выражения может иметь тип данных binary или varbinary. Возвращаемое значение имеет тип данных, соответствующий наибольшему типу данных. Например, если в выра жении присутствуют операнды типа данных i n t и s m a l l i n t, то возвращаемый результат будет иметь тип данных i n t ;

для типов данных t i n y i n t и smallint будет возвращено значение типа smallint и т. д. При использовании операндов типа binary или varbinary значение все равно будет иметь тип данных i n t, smallint И И tinyint.

Л..

Рассмотрим пример битовых операторов:

SELECT 0x7FFFFFFF+0, 0x02435253026534224001i-,Q,. 0x0^435353026534224001 I SELECT 1 Л 1, 1 Л 2, 3| (-127)., 15 Л 7,,15^22, 15&22, Будет возвращен следующий результат:

2147483647 874659841 (1 row(s) affected) О 3 -125 ' 8 V 25.. ". 6 (1 row(s) affected) --••••.:

№78 Часть V. Программирование Логические операторы Операторы этого типа, как и операторы сравнения, возвращают значение TRUE или FALSE и могут использоваться в любых командах, работающих с логически ми значениями. Некоторые логические операторы могут быть представлены в виде комбинации одного или более операторов сравнения, являясь своего рода надстройкой над ними. Замена множества операторов сравнения одним логиче ским оператором делает программирование на Transact-SQL более удобным и функциональным.

К логическим операторам Transact-SQL относятся следующие операторы:

• NOT. Выполняет отрицание логического выражения. То есть, если логическое выражение имело значение TRUE, TO будет возвращено FALSE И наоборот.

Оператор NOT может использоваться как составная часть других операторов.

Синтаксис оператора NOT таков:

[NOT] boolean_expression Приведем пример работы оператора NOT:

IF (1=1) PRINT 'TRUE' ELSE PRINT 'FALSE IF NOT (1=1) PRINT 'TRUE' ELSE PRINT 'FALSE' Будет выведен следующий результат:

TRUE FALSE • AND. Оперирует с двумя логическими выражениями. Если оба выражения равны TRUE, то будет возвращено значение TRUE. ВО всех остальных случаях возвращается FALSE.

• OR. Оперирует с двумя логическими выражениями. Если хотя бы одно из вы ражений равно TRUE, то будет возвращено TRUE. Значение FALSE будет воз вращено только в том случае, когда оба выражения равны FALSE.

П BETWEEN. Этот оператор возвращает TRUE, если проверяемое значение лежит в указанном диапазоне. В противном случае возвращается FALSE. Оператор BETWEEN может быть легко заменен двумя операторами сравнения, объеди ненными в одно выражение с помощью оператора AND. Синтаксис оператора BETWEEN:

test_expression [NOT] B T E N begin_expression A D end_expression EWE N Аргумент test_expression определяет выражение, которое будет проверять ся на соответствие диапазону. Начальное значение диапазона задается с по мощью аргумента begin_expression, конечное — с помощью аргумента end_expression. При использовании оператора BETWEEN следует учитывать, что если проверяемое выражение совпадает с границами диапазона, то будет возвращено TRUE.

Приведенный ниже пример производит выборку всех названий книг, цена которых находится в диапазоне от 12 до 20:

SELECT price, title FROM titles WHERE price BETWEEN 12 AND Глава 25. Основы Transact-SQL Будет возвращен следующий результат:

price title 19.9900 The Busy Executive's Database Guide 19.9900 Straight Talk About Computers 19.9900 Silicon Valley Gastronomic Treats 20.0000 Secrets of Silicon Valley 19.9900 Prolonged Data Deprivation: Four Case Studies 14.9900 Sushi, Anyone? (6 row(s) affected) Аналогичного результата можно добиться при использовании следующего запроса:

SELECT price, title FROM titles WHERE price=12 AND price= • ALL. Сравнивает скалярное значение со всеми значениями в наборе. Если условие выполняется для всех значений набора, то возвращается TRUE. В противном случае возвращается FALSE. ПОЛНЫЙ синтаксис команды ALL:

s c a l a r _ e x p r e s s i o n { = | | ! = | | = | ! | | = | ! } ALL (subquery) Аргумент s c a i a r e x p r e s s i o n задает скалярное выражение, которое будет сравниваться со всеми значениями набора данных (subquery). Набор данных для оператора ALL может задаваться только с помощью подзапроса, возвра щающего единственный столбец с типом данных, соответствующим сравни ваемому скалярному выражению. Приведенный ниже пример дает ответ на вопрос, есть ли в таблице authors хоть один автор, проживающей в Москве:

IF ('Moscow' != ALL (SELECT city FROM authors)) PRINT 'Нет автора из Москвы' ELSE PRINT 'Как минимум один автор из Москвы' ( Замечание ) Некоторые логические операторы являются взаимозаменяемыми. Например, приве денный пример можно легко переделать на использование оператора IN ИЛИ EXISTS, которые будут рассмотрены далее. Выбор конкретного оператора лежит на разработчике. Тем не менее, оптимизатор запросов SQL Server 2000 может при не обходимости выполнить замену некоторого оператора на другой, обеспечивающий более высокую производительность.

• ANY и SOME. Эти два оператора эквивалентны. Можно использовать любой из них. Оператор сравнивает указанное скалярное выражение со всеми значе ниями набора и возвращает TRUE, если логическое условие выполняется хотя бы для одного значения набора. Если же условие не выполняется ни для од ного значения набора, то возвращается FALSE. Как и для команды ALL, набор данных для рассматриваемых операторов может задаваться только с помо щью подзапроса. Полный синтаксис операторов следующий:

s c a l a r _ e x p r e s s i o n ( = | | ! = | | = | ! | | = | ! } {SOME I ANY} ( s u b q u e r y ) 1080 Часть V. Программирование Попробуем решить описанную в предыдущем пункте задачу с помощью опе ратора ANY:

IF ('Moscow' = ANY (SELECT city FROM authors)) PRINT 'Как минимум один автор из Москвы ELSE PRINT "Нет автора из Москвы' • IN. С помощью этого оператора можно определить, совпадает ли указанное выражение хотя бы с одним значением набора. Оператор IN является своего рода аналогом оператора *= ANY, однако' обладает некоторыми преимуществами.

В частности, в качестве проверяемого значения допускается использовать не только скалярные величины, но и любые выражения. Кроме того, для форми рования набора данных может применяться не только подзапрос, но и простое перечисление величин через запятую. Полный синтаксис оператора IN:

t e s t _ e x p r e s s i o n [NOT] IN (subquery | e x p r e s s i o n [,...n]) Приведем пример вызова оператора IN:

IF ('Moscow' IN (SELECT c i t y F O a u t h o r s ) ) RM PRINT 'Как минимум один автор из Москвы' ELSE PRINT 'Нет автора из Москвы' Часто оператор IN служит для ограничения диапазона выборки в конструк ции WHERE. В приведенном ниже примере выводится список всех книг и их типов, написанных авторами проживающими в штатах Минесота, Канзас и Юта:

SELECT title, type FROM titles WHERE title_id IN (SELECT title_id FROM authors, titleauthor WHERE state IN ('IN', 'UT', 'KS') AND t itleauthor.au_id=authors.au_id) Будет получен следующий результат:

title type The Gourmet Microwave mod cook Is Anger the Enemy? psychology Life Without Fear psychology (3 row(s) affected) • EXISTS. Этот оператор возвращает TRUE, если подзапрос возвращает хоть од ну строку, и FALSE в противном случае. Оператор EXISTS может с успехом заменить оператор ANY, однако он обладает дополнительными преимущест вами. Например, с помощью оператора ANY МОЖНО задать только одно логи ческое условие, тогда как с помощью оператора EXISTS МОЖНО проверить существование данных, удовлетворяющих множеству условий. Синтаксис оператора EXISTS следующий:

EXISTS Subquery Глава 25. Основы Transact-SQL Проверка существования автора, проживающего в Москве, с помощью опе ратора EXISTS может быть выполнена так:

IF EXISTS (SELECT • FROM authors WHERE city='Moscow') PRINT 'Как минимум один автор из Москвы ELSE PRINT 'Нет автора из Москвы' 1082 Часть V. Программирование зона (например [a-f]). Допускается комбинирование обоих типов пере числения значений.

SELECT c i t y F O R M authors WHERE c i t y LIKE '_[aldf]1%[o-sr]' Будет выведен следующий результат:

city Глава 25. Основы Transact-SQL D GOTO — оператор перехода;

О USE — оператор переключения базы данных;

d WAITFOR — оператор приостанова;

• GO — оператор конца пакета команд.

BEGIN...END Конструкция BEGIN...END предназначена для объединения двух и более команд в единый блок, воспринимаемый сервером как одно целое. В частности, подобная группировка команд используется при работе с циклами и командами ветвле ния. Как команды ветвления, так и команды цикла позволяют работать лишь с одной командой. Следующая команда будет восприниматься как команда, не относящаяся к циклу или блоку ветвления. В приведенном ниже примере ко манда SELECT 10 обрабатывается независимо от того, какое значение имеет пе ременная Svari. Тогда как команда SELECT 'Первая часть месяца 1 будет вы полнена только в том случае, когда выполняется логическое условие.

DECLARE @varl datetime IF DATEPART(dd,@Varl)= SELECT 'Первая часть месяца' SELECT Чтобы обеспечить выполнение команды SELECT Ю В зависимости от логиче ского условия, необходимо воспользоваться конструкцией BEGIN.END:

DECLARE @Varl datetime IF DATEPART(dd,@Varl)= BEGIN SELECT 'Первая часть месяца' SELECT END Для облегчения визуального восприятия введенного кода служит выделение ко манд, содержащихся внутри конструкции BEGIN.END, а также собственно конст рукции BEGIN...END, пробелами. Такое выделение позволяет достаточно легко читать код.

Допускается создание вложенных конструкций BEGIN...END. SQL Server практически не ограничивает глубину вложенности конструкций. Однако на практике вложенность обычно н*е превышает 5—7 уровней. В конструкции BEGIN...END могут встречаться команды ветвления, организовываться циклы, соз даваться транзакции и т. д.

IF...ELSE Посредством конструкции IF...ELSE В Transact-SQL реализуется ветвление алго ритмов. Типичным примером такого ветвления является выполнение набора команд в зависимости от соблюдения какого-то условия. Например, добавлять в таблицу строку с описанием человека скорее всего не имеет смысла, если такая ЩспУ: Программировать информация уже существуем. Подобных1 примеров множество идате список лег ко продолжить.

Синтаксис конструкции I F. E L S E следующий:

IF Boolean_expression { sql_statement I statement_block } [ELSE { sql_statement I statement_bloGk } J С помощью аргумента Воо1еап_вкргезз1бп определяется логическое выраже ние, от результата вычисления которого будет зависеть выполняемый набор ко манд. Если логическое выражение возвращает значение TRUE (истина), то вы полнен набор команд, располагающийся непосредственно после логического выражения. Точнее говоря, будет выполнена лишь одна команда. Если требуется выполнить блок команд, то необходимо воспользоваться конструкцией BEGIN...END, как это было описано в предыдущем разделе.

После ключевого слова ELSE находится команда, которая будет выполнена в случае возвращения логическим условием значения FALSE (ЛОЖЬ). Указание этой части необязательно. Если необходимо выполнение более одной команды, то также следует воспользоваться конструкцией BEGIN...END.

Следует быть внимательным при использовании в логическом условии значения NULL. Дело в том, что сравнение этого значения не всегда возвращает TRUE при вычислении выражения NULL=NULL. Значение TRUE возвращается только в случае установки в OFF параметра ANSI_NULLS:

SET ANSI_NULLS OFF WHILE...CONTINUE Посредством команды WHILE В Transact-SQL организуется цикл.Сразу отметим, что в SQL Server 2000 имеется всего один тип цикла — с предусловием, который и реализуется с помощью команды WHILE. Заметим, что во многих других язы ках в распоряжении пользователя имеется до трех типов циклов. Несмшщя. нд это, можно довольно легко реализовывать любые циклы.

Рассмотрим синтаксис команды WHILE:

WHILE Boolean_expresSion { sql_statement I statementj&loek ) [ BREAK ] { sql_statement I statement_block } [ CONTINUE ] С помощью параметра воо1вап_вхргвз&1оц«»указивается логическое Цикл будет выполняться до тех пор, пока услрвиевозвращает /значение•• Предполагается, что в условии участвуют функции или переменные, значения,:

которых меняются в ходе выполнения цикла. Однако можно организовывать и бесконечные циклы, указав в качестве условия цикла выражение типа 1=1. Вы~ ход из такого цикла должен осуществляться принудительно с помощью коман Глава 25. Основы Tmuact-SQL 1Q ды BREAK, которая должна выполниться в теле цикла (дбычно опять же в зави симости от логического условия).

Команда WHILE работает с единственной командой. Если же необходимо указать большее количество команд, то потребуется использовать конструкцию BEGIN...END. В этом случае тело цикла будет представлено всеми командами, объ единенными с помощью конструкции BEGIN...END. Команда CONTINUE позволяет начать новый виток цикла» не дожидаясь выполнения всех команд цикла.

В качестве примера рассмотрим цикл, вычисляющий логарифм значения, хра нящегося в переменной ваа (в примере это 5):

DECLARE ваа i n t, @fact b i g i n t SET ваа= SET @Fact=l WHILE @aa BEGIN SET eFact=@Fact*@aa SET ваа=@аа- END SELECT 8Fact После выполнения этого примера будет возвращен следующий результат:

(1 row(s) affected) Можно несколько сократить приведенный пример:

DECLARE 0aa i n t, 9fact b i g i n t SELECT @aa=5, 6Fact=l WHILE @aa SELECT @Fact=6Fact*eaa, @aa=@aa-l, SELECT 9Fact GOTO Рассматриваемая команда предназначена для выполнения перехода на указан ную метку (label). Метки представляют собой символьную строку, удовлетво ряющую стандартным правилам именования объектов. После имени метки ста вится символ двоеточия, который и свидетельствует о том, что соответствующая строка является меткой. При выполнении оператора GOTO следует указать только имя метки без символа двоеточия. В качестве примера, демонстрирующего ис пользование команды GOTO, рассмотрим организацию цикла с постусловием, выполняющего вычисление факториала:

D C A E ваа i n t, ELR @fact bigint SELECT 8aa=5, 8Fact-l cikl:

Часть V. Программирование SELECT @Fact=@Fact*@aa, @aa=@aa-l IF @аа1 GOTO c i k l • SELECT S F a c t Команда GOTO существует практически во всех языках программирования. Тем не менее, ее использование считается плохим тоном, т. к. это нарушает прин ципы структурного программирования. Практически во всех ситуациях можно обойтись без использования команды GOTO.

USE Все команды выполняются в контексте какой-то базы данных. Такая база дан ных называется текущей. При обращении к объектам текущей базы данных не требуется указание ее имени. Например, если текущей является база данных pubs, то обращение к таблице authors этой базы данных можно осуществить следующим образом:

SELECT * FROM a u t h o r s Но когда работа с этой же таблицей ведется в контексте иной базы данных, чем pubs, то нужно явно указать имя базы данных:

SELECT * FROM pubs..authors Глава 25, Основы Transact-SQL GO Клиент отправляет серверу команды на выполнение так называемыми пакетами (batch). После работы всех команд пакета (или в ходе выполнения пакета) сер вер возвращает клиенту результат. После этого клиент может отправить сле дующий пакет. При работе с Query Analyzer в качестве пакета рассматривается набор команд, которые пользователь выделил и запускает на выполнение. Если в окне ничего не выделено, то будут выполнены все команды, имеющиеся в ок не. Однако некоторые из них должны запускаться отдельно от других команд. К таким командам можно отнести команды CREATE, С ПОМОЩЬЮ которых выполня ется создание объектов базы данных, команды BACKUP И RESTORE, предназначен ные, соответственно, для выполнения создания и восстановления резервных копий баз данных, а также некоторые другие команды. При работе с Query Analyzer такие команды просто выполняются отдельно.

Тем не менее, можно явно разделить весь набор команд на отдельные пакеты.

Для этого просто-напросто с помощью ключевого слова GO необходимо опреде лить конец пакета. Заметим однако, что локальные объекты (переменные, кур соры, таблицы и т. д.) существуют в пределах пакета. Например, следующий код будет работать при выполнении его как одного пакета:

DECLARE @aa int SET @aa= SELECT @aa Попробуем же эти команды разделить на два пакета:

DECLARE @aa int SET §aa= GO SELECT @aa Будет выдано следующее сообщение об ошибке, свидетельствующее об уничто жении локальной переменной @аа:

Server: Msg 137, Level 15,.State 2, Line Must declare the variable •@aa'.

Глава Типы данных SQL Server В предыдущей главе рассматривалось использование переменных. При объявле нии переменной с помощью команды DECLARE необходимо указать ее тип дан ных. Тип данных определяет, какая информация может храниться в перемен ной, и какие операции могут выполняться над этими данными. В общем, понятие и использование типов данных в Transact-SQL соответствуют большин ству современных языков.

Типы данных играют большую роль при работе с таблицами. Каждый столбец должен иметь конкретный тип данных. В одной таблице может быть множество столбцов как с одинаковыми, так и с различными типами данных. Наконец, типы данных активно используются при работе с хранимыми процедурами, оп ределяя вид значений, указываемых при вызове.

В SQL Server 2000 набор типов данных несколько расширен по сравнению с пре дыдущей версией SQL Server — добавлены типы данных bigint, table и sqi_variant. В итоге в распоряжении пользователей имеется набор из 27 встроенных типов данных. На основе некоторых из них могут быть созданы новые типы данных, называемые пользовательскими (user-defined). Примером та кого типа данных может служить тип sysname (основанный на nvarchar (128)), активно применяемый в системных таблицах для хранения имен объектов.

Типы данных SQL Server 2000 можно разбить на следующие группы:

• целочисленные (Integers) — bigint, int, smaiiint и tinyint;

• нецелочисленные (Decimal) — decimal, numeric, float И real;

а денежные (Money) — money и smaiimoney;

П дата И время (Date and Time) — datetime И smalldatetimej П Д О Ч Ы (Binary) — binary, varbinary И image;

ВИН е • Строковые (String) — char, varchar, nchar И nvarchar;

О текстовые (Text) — t e x t и ntext;

• Специальные (Specials) — timestamp, uniqueidentifier, b i t, cursor, table И sql_variant.

Целочисленные типы данных Числовые типы данных предназначены для хранения данных, над которыми ожидается проведение стандартных арифметических операций, а также исполь Глава 26. Типы данных SQL Server 2000 Ю зование в различных функциях, работающих с числовыми значениями. В прин ципе, ничто не мешает хранить числа в виде строки символов. Однако над та кой строкой невозможно выполнять арифметические операции, так как для символьных строк допускается только склеивание их друг с другом.

Числовые типы данных различаются по возможности хранения чисел со знаком (отрицательных), чисел с цифрами после запятой, по максимально допустимому количеству цифр до и после запятой и точности представления дробных чисел.

В этом разделе будут рассмотрены целочисленные типы данных.

В SQL Server 2000 поддерживаются следующие целочисленные типы данных:

О b i g i n t — это новый тип данных, использующий для хранения данных 8 байт. В предыдущих версиях SQL Server самым большим целочисленным типом данных был i n t, сосотящий из 4 байт для хранения чисел. При работе с типом данных b i g i n t пользователи могут хранить числа в диапазоне от -9 223 372 036 854 775 808 (-2 6 3 ) до 9 223 372 036 854 775 807 (2 б з -1).

О i n t предназначен для хранения как положительных, так и отрицательных значений. Для хранения чисел в этом типе данных используется 4 байта или 32 бита, что обеспечивает 2 3 2 комбинаций (4 294 967 296). Для хранения соб ственно числа используется 31 бит, а крайний левый бит предназначен для указания знака числа. Если 32 бит установлен в 1, то число отрицательное.

Тем самым обеспечивается хранение чисел в диапазоне от —231 до 231—1, что соответствует интервалу —2 147 483 648 до 2 147 483 647.

П smaliint, как и предыдущий тип, обеспечивает хранение и положительных, и отрицательных значений. Однако для представления чисел используется 2 байта (16 бит). Таким образом, в распоряжении пользователя имеется 65 536 комбинаций, что с учетом знака обеспечивает хранение чисел в диапа зоне от - 2 1 5 до 2 1 5 -1 или соответствует интервалу от -32 768 до 32 767.

• t i n y i n t — это самый "маленький" из целочисленных типов данных, исполь зующих для хранения чисел всего 1 байт. В отличие от двух предыдущих ти пов, не разрешает хранение информации о знаке числа. Таким образом, в распоряжении пользователя имеется 256 комбинаций (2 8 ), что соответствует интервалу от 0 до 255.

Нецелочисленные типы данных Типы данных этой группы применяются для хранения чисел с десятичной точ кой. В SQL Server 2000 существует два вида нецелочисленных типов данных:

• Десятичные (Decimal). Для хранения чисел этого типа они представляются в виде отдельных цифр, каждая из которых хранится отдельно. Для хранения каждой цифры отводится 4 бита. Хотя 4 бита обеспечивают 16 комбинаций, тем не менее, для хранения цифры используется всего 10 комбинаций (от до 9). Кроме того, с помощью 1 байта можно сохранить всего 2 цифры, что обеспечивает представление чисел в диапазоне от 0 до 99. Однако с помо щью 1 байта можно описать 256 комбинаций. Очевидно, что десятичные не 1000 Часть V. Программирование целочисленные типы данных не лучшим образом используют предоставлен ные ресурсы. Тем не менее, только такой подход обеспечивает точное пред ставление чисел с десятичной точкой. Общее количество цифр и количество цифр после запятой для десятичных типов строго фиксировано.

• Приблизительные (Approximately). Этот вид нецелочисленных типов данных обеспечивает хранение чисел в огромном диапазоне от бесконечно малых до предельно больших. Для этого число представляется в экспоненциальном формате — в виде мантиссы и порядка. Хотя такой подход обеспечивает оп тимальное использование предоставляемых ресурсов (в отличие от десятич ного вида), тем не менее, точность вычислений оставляет желать лучшего.

Низкая точность вычисления связана именно с представлением числа в виде мантиссы и порядка. Мантисса является числом, которое необходимо умно жить на 10 в степени, равной значению порядка. Обычно мантисса представ ляет собой положительное или отрицательное число в пределах от 1 до 9 и с множеством чисел после запятой. Порядок — это степень, в которую необ ходимо возвести число 10. После этого мантисса умножается на 10 в степени порядка. Полученный результат и является числом, с которым будут произ водиться расчеты. При записи числа в экспоненциальной форме сначала за писывается мантисса, затем символ Е, обозначающий 10, после чего указы вается порядок. Например, число -7,23453Е+215 в экспоненциальной форме соответствует обычному десятичному числу —7234530000000000 с общим ко личеством нулей равным 210. Низкая точность операций с числами в экспо ненциальной форме связана с тем, что при несовпадении значений мантиссы приходится жертвовать точностью и округлять число.

К десятичным типам данных относятся следующие типы данных:

О decimal [ ( p [, s ] ) ] и numeric [ (p[,s]) ]. Эти два типа данных эквивалент ны. При использовании десятичных типов данных необходимо явно указать общее количество цифр (в сумме до и после запятой), а также отдельно ко личество цифр после запятой. Общее количество цифр указывается с помо щью аргумента р, тогда как количество цифр после запятой задается аргу ментом s. Значение аргумента р может лежать в пределах от 1 до 38. От значения р зависит количество байт, отводимых для хранения чисел, мини мум отводится 2 байта, максимум— 17 байт. Аргумент s может достигать значения аргумента р, но не должен превышать его. По умолчанию значение аргумента s устанавливается равным 0, т. е. не поддерживается хранение цифр после запятой. Значение параметра р, если оно не задано явно, может динамически изменяться в зависимости от величины хранимого значения, что и демонстрирует следующий пример:

DECLARE @Varl d e c i m a l, @Var2 decimal SET @Varl=1122334455667788. SET @Var2=l SELECT @Varl, DATALENGTH(@Varl) SELECT @Var2, DATALENGTH(@Var2) SET @Var2=1122334455667788. SELECT @Var2, DATALENGTH(@Var2).

Глава 26. Типы данных SQL Server 2000 Функция DATALENGTH возвращает количество байт, используемое для хране ния указанного выражения. Будет получен следующий результат:

(1 row(s) affected) (1 row(s) affected) 1122334455667788 (1 row(s) affected) К приблизительным типам данных относятся перечисленные ниже типы данных:

• float [ (п) ]. Аргумент п задает количество бит, необходимых для хранения мантиссы. Максимальное значение этого аргумента равно 53. Если значение п находится в диапазоне от 1 до 24, то для хранения числа используется 4 байта. Для диапазона от 25 до 53 отводится 8 байт. В первом случае дости гается точность до 7 цифр, тогда как во втором — до 15 цифр. Как видно, особой экономии от применения минимального значения п нет. То есть для хранения, например, числа со значением п не более 9, будет отводиться столько же памяти, как и для хранения числа со значением п до 24. Если нет особых причин, то для обеспечения дополнительной точности лучше исполь зовать крайние значения п — 24 или 53. С другой стороны, повышенная точ ность требует дополнительных ресурсов процессора при вычислениях. При значении п величина мантиссы может достигать 308, и допускается хранить числа в диапазоне от -1.79Е+308 до 1,79Е+308. Значение мантиссы может быть как положительным, так и отрицательным. То есть можно хранить не только очень большие числа, но и очень малые.

О real. Этот тип данных является частным случаем типа float, а конкретнее это компактная запись типа данных float (24) со всеми вытекающими последст виями. Для хранения числа используется 4 байта, обеспечивается точность до 7 цифр. Само число может лежать в диапазоне от — 3,40Е+38 до 3,40Е+38.

Денежные типы данных Эта группа типов данных предназначена для хранения чисел, представляющих информацию о деньгах. Денежные типы данных обеспечивают хранение до 4 цифр после десятичной точки. В SQL Server 2000 имеется два денежных типа:

П money. Для хранения данных этого типа отводится 8 байт, что обеспечивает представление значений в диапазоне от - 2 6 3 (-922 337 203 685 477,5808) до 2 6 3 (+922 337 203 685 477,5807). Для хранения более точных или больших значений можно использовать тип данных decimal или numeric.

О smaiimoney. Этот тип данных является компактным вариантом типа данных money. Для данных используется 4 байта, что обеспечивает хранение чисел в диапазоне от - 2 3 1 (-214 748,3648) до 2 3 1 (+214 748,3647).

1092 Часть V. Программирование ь С Замечание ^ Для денежных типов допускается использование специальных символов, обозна чающих валюту, к которой принадлежит число. Например, сумма в 145 долларов и 17 центов может быть записана как $14 5.17. В SQL Server 2000 имеется поддержка 18 символов национальных валют.

Типы данных "дата и время" Как следует из названия, типы данных этой группы служат для хранения ин формации о дате и времени. Конечно, для хранения этих данных можно легко использовать символьные строки, однако применение специализированных ти пов дает определенные преимущества. Например, можно легко сравнивать даты, выделять из них отдельные части (год, месяц, число, день недели, часы и т. д.), вычитать и складывать их и т. д. Поддержка этих операций встроена в Transact SQL. При работе с символьными строками необходимо будет.реализовывать дополнительные алгоритмы обработки данных.

В SQL Server 2000 имеются следующие типы данных для хранения информации о дате и времени:

• datetime. Для хранения данных применяются два 4-байтовых блока. Первые 4 байта хранят информацию о количестве дней, прошедших после базовой даты — 1 января 1753 года. В этот день были синхронизированы Григориан ский и Юлианский календари, до этого отличавшиеся на 11 дней. Разработ чики Microsoft посчитали, что хранение информации о более ранних датах нецелесообразно, так как в SQL Server 2000 нет поддержки разных календа рей. При необходимости для хранения информации о более ранних датах можно использовать символьные строки или числовые значения. Вторые 4 байта предназначены для хранения информации о количестве миллисе кунд, прошедших после полуночи. В итоге тип данных datetime позволяет хранить информацию о датах в интервале от 1 января 1753 года до 31 декабря 9999 года с точностью до 3,33 миллисекунды.


О smaiidatetime. Этот тип данных использует в общей сложности 4 байта — два блока по 2 байта. Первые два байта отображают количество дней, про шедших после 1 января 1900 года. Два оставшихся байта применяются для хранения количества минут, прошедших после полуночи. Таким образом, тип данных smaiidatetime может использоваться для хранения дат в диапа зоне от 1 января 1900 года до 6 июня 2079 года с точностью до 1 минуты.

Хотя данные о времени хранятся в специальном формате, тем не менее, для удобства была обеспечена работа с данными в символьном виде. В общем виде информация о дате и времени указывается в формате "мм DD YYYY hh:mmAP/PM".

Сервер автоматически выполняет преобразование символьной строки в специ альный формат. Помимо указанного формата в Transact-SQL допускается при менение множества других форматов даты и времени. В табл. 26.1 приведен об зор этих форматов.

Двоичные типы данных Двоичные типы данных предназначены для хранения больших блоков двоичных данных. Некоторые данные в SQL Server 2000 хранятся не в виде целых чисел или строк, а непосредственно в виде блока двоичных данных. Примером таких данных может служить идентификатор безопасности (SID, Security ID) домена, для хранения которого может использоваться до 85 байт.

1094 Часть V. Программирование В SQL Server 2000 поддерживаются следующие двоичные типы данных:

• binary! (п)]. Этот тип данных позволяет хранить блоки двоичных данных размером от 1 до 8000 байт. Объем, занимаемый выражением типа данных binary, равен п+4. Аргумент п определяет количество байт, которые будут вьщелены для хранения данных. Для значений типа binary вьшеляется всегда фиксированное количество байт, независимо от того, какой реальный объем памяти необходим. Например, если столбец таблицы имеет тип данных b i nary (ЮОО), а пользователь хранит значения размером 100 байт, то в таблице все равно будет выделяться 1004 байта (1000+4) на столбец каждой строки.

( Замечание ) Ограничение максимального размера двоичного блока (8000 байт) связано с разме ром страницы (8 Кбайт). Для типов данных b i n a r y и v a r b i n a r y, как и для многих других типов данных, разбиение столбца на множество страниц невозможно.

• varbinary [ (n) ]. Как и предыдущий, этот тип данных обеспечивает хранение блоков от 1 до 8000 байт. Для хранения значений также используется объем памяти п+4 байт. Особенность же типа varbinary в том, что п определяет максимальное количество байт, которое может быть выделено для хранения значений. Однако, если для хранения выражения требуется меньшее количе ство байт, то будет выделено ровно столько байт, сколько необходимо. При менительно к рассмотренному примеру использование типа данных varbi nary дало бы экономию места 90%. Однако, хотя использование типа данных varbinary дает экономию ресурсов, тем не менее, операции обработки зна чений этого типа занимают больше времени.

( Замечание ) Приставка var в названии типа данных является сокращением от английского слова variable, что переводится как переменная (длина). Объекты типов данных с пристав кой var занимают столько памяти, сколько реально занимает выражение.

О image. Типы данных binary и varbinary обеспечивают хранение блоков дво ичных данных размером до 8000 байт. Во многих случаях этого объема вполне достаточно. Однако существует ряд задач, которые требуют наличия блоков данных большего размера. Например, при использовании SQL Server 2000 для хранения документов необходимо обеспечить возможность хранения данных объемом в несколько мегабайт. Для удовлетворения этих требований был раз работан тип данных image, позволяющий хранить до 2 Гбайт данных (2 147 483 647 байт, 231—1). Максимальный размер не задается явно и зависит от реального размера данных. В таблице для значений типа данных image про странство выделяется страницами. То есть, если данные занимают 25 Кбайт, то для их хранения будет выделено 32 Кбайта (4 страницы). Даже если данные ре ально занимают всего несколько сотен байт, то все рано будет выделено 8 Кбайт. Тип данных image относится к так называемым "тяжелым" типам данных. Вставка, чтение и изменение таких данных ведется несколько иными методами, чем при работе с "нормальными" типами данных.

Глава 26. Типы данных SQL Server 2000 Ю Замечание Двоичные данные могут быть введены вручную в формате OXFFFF...FF. СИМВОЛЫ ОХ указывают, что далее следует набор двоичных данных в шестнадцатеричной фор ме. Эти два символа должны указываться всегда. Каждый байт описывается строго двумя символами: 0—9 или А—F. Если первый символ байта равен нулю, он все равно должен быть указан. Например, десятичное число 59229 в шестнадцатерич ном виде будет записано как 0xE75D, ЧТО занимает всего 2 байта.

Строковые типы данных Типы данных этой группы служат для хранения символьных строк. В принципе, текстовая информация может быть сохранена в виде двоичных данных, однако хранение символьных данных в специализированных форматах обладает рядом преимуществ. В частности, при выполнении запросов символьные данные мож но просмотреть визуально. При работе с символьными типами данных в распо ряжении разработчиков имеются специальные функции, реализующие боль шинство операций обработки данных.

( Замечание ^ В Transact-SQL имеется более 20 функций, предназначенных для работы с тексто выми строками. Работа с этими функциями будет рассмотрена в следующей главе.

К строковым типам SQL Server 2000 относятся типы данных:

П chart (п)]. Этот тип данных позволяет хранить до 8000 знаков в формате ASCII. Этот формат использует 1 байт для представления каждого символа, что обеспечивает поддержку 256 символов. Таким образом, максимальный объем ограничен 8000 байтами, что связано с размером страницы. Для срав нения, в SQL Server 6.x тип данных char позволял хранить строки длиной до 255 символов, хотя размер страницы составлял 2 Кбайта. Аргумент п опреде ляет количество символов, которое разрешается хранить. Независимо от то го, какая реальная длина строки, всегда будет резервироваться фиксирован ное количество памяти. Если в столбце таблицы зарезервировано 4000 сим волов, а реально хранится всего 50 символов, то неиспользуемое прост ранство будет заполнено пробелами.

• varchar [ (n) ]. Как и предыдущий, тип данных varchar обеспечивает хране ние блоков данных до 8000 символов в стандарте ASCII. Отличие этого типа данных от char в том, что аргумент п определяет не конкретный объем памя ти, выделяемый для хранения значений, а максимально возможное количест во символов. Реальный же размер памяти, занимаемый значением, соответ ствует его длине. Например, если столбец имеет тип данных varchar (зоо), а сохраненное значение имеет длину всего лишь 70 символов, то в таблице бу дет выделено 70 байт, а не 300, как это было бы для типа данных char (зоо).

О nchar [ (n) ]. В отличие от двух предыдущих типов, тип данных nchar обеспе чивает хранение текста в формате Unicode. В стандарте Unicode для представ Ю96 Часть V. Программирование ления каждого символа используется 2 байта, что обеспечивает поддержку 65 536 символов. Это значительный прогресс по сравнению со стандартом ASCII. Теперь пользователи могут легко хранить тексты на любом националь ном языке. Однако, как и для типов данных char и varchar, для типа nchar может быть выделен максимальный блок размером в 8000 байт. Так как один символ представлен 2 байтами, то максимальная длина текстового блока типа данных nchar составляет 4000 символов. Выделение памяти для объектов типа данных nchar выполняется аналогично типу char. To есть отводится фиксиро ванный размер памяти (пх2 байт), независимо от реального размера данных.

( Замечание ^ Символ п в начале имени типа данных означает, что этот тип данных поддерживает стандарт Unicode.

О nvarchar[ (п! ]. Этот тип данных относится к типу nchar так же, как тип varchar относится к типу char. To есть тип данных nvarchar обеспечивает хранение текстовых строк в формате Unicode максимальной длиной до 4000 символов (8000 байт). При этом для объектов этого типа отводится ров но столько памяти, сколько реально занимает значение.

Текстовые типы данных Типы данных этой группы очень близки строковым типам данных. Обе группы типов данных предназначены для хранения текстовых блоков данных. Однако размер строковых типов данных ограничен 8000 байтами. Конечно, для боль шинства задач этого достаточно, не все же иногда бывает необходимо хранить.

довольно большие блоки текстовой информации. Например, можно с уверенно стью сказать, что сохранить несколько сотен страниц книги в любом строковом типе данных не получится. Решением этой задачи будет использование тексто вых типов данных, обеспечивающих хранение очень больших объемов текста.

В SQL Server 2000 поддерживаются следующие текстовые типы данных:

П text. Этот тип данных обеспечивает хранение* блоков текстовых данных раз мером до 2 3 1 -1 символов (2 147 483 647). При этом для представления каж дого символа используется 1 байт. Даже во время применения кодовых стра ниц, использующих двухбайтовое представление символа, данные типа данных t e x t хранятся в однобайтовом представлении.

О ntext. В отличие от предыдущего типа данных, применение типа данных ntext позволяет работать с двухбайтовым представлением символов. Это дает набор из 65 536 символов, что позволяет хранить текст практически на лю бом национальном языке. Хотя для типа данных n t e x t, как и для типа дан ных t e x t, доступно максимум 2 147 483 647 байт. Тем не менее, максималь ное количество символов составляет 2 3 0 -1 (1 073 741 823).


Работа с текстовыми типами данных отличается от работы с остальными типами данных. Как и тип image, типы данных t e x t и n t e x t относятся к так называв Глава 26. Типы данных SQL Server 2000 W мым "тяжелым" типам данных. Для работы с этими тремя типами данных слу жат специальные функции и команды. Кроме того, не допускается создание переменных, имеющих типы данных next, n t e x t или image.

Специальные типы данных К специальным относятся типы данных, которые нельзя отнести ни к одному из предыдущих типов данных. Специальные типы данных имеют специфическое назначение, часто узко специализированное.

В SQL Server 2000 имеются следующие специальные типы данных:

CJ timestamp. Этот тип данных переводится как "временной штамп" и предназна чен для отслеживания последовательности изменения строк таблиц базы дан ных. Тип данных timestamp не имеет ничего общего с типами данных datetime и smalldatetime. Кроме того, пользователь не обладает возможно стью изменять или явно задавать значения столбцов с типом данных times tamp. В любой таблице может быть создан столбец, имеющий тип данных timestamp. Однако в каждой таблице может быть только один такой столбец.

Если его имя не задано явно, то по умолчанию присваивается имя timestamp.

Каждый раз при вставке новой или изменении существующей строки в табли це со столбцом timestamp сервер автоматически вставляет в столбец timestamp новое значение. Это значение уникально в пределах базы данных и монотонно возрастает на 1 каждый раз при вставке очередного значения. Уникальность значения timestamp в пределах базы данных гарантирует, что ни в каких лю бых двух таблицах базы данных не будет двух строк с одинаковым значением в столбце timestamp. Тип данных timestamp активно применяется при реплика ции транзакций и может быть с успехом использован разработчиками. Текущее значение счетчика timestamp хранится в глобальной переменной @§DBTS. ДЛЯ хранения типа данных timestamp требуется 8 байт.

CJ u n i q u e i d e n t i f i e r. Название этого типа данных можно перевести как уни кальный идентификатор, тогда как полное название типа глобальный уникаль ный идентификатор (GUID, Global Unique Identifier). Тип данных timestamp обеспечивает уникальность данных в пределах базы данных, однако иногда такого диапазона уникальности бывает недостаточно. Например, при работе с базами данных, располагающимися на разных серверах, обеспечить уни кальность данных с помощью типа данных timestamp невозможно, т. к. каж дый из серверов ведет свой счетчик, не синхронизированный с другими сер верами. Тип данных u n i q u e i d e n t i f i e r был разработан специально для того, чтобы обеспечить пользователей и разработчиков механизмом уникальной идентификации данных в пределах планеты. Для хранения идентификатора необходимо 16 байт. Сам же идентификатор может быть представлен в фор мате хххххххх-хххх-хххх-хххх-хххххххххххх, где хх обозначает 1 байт. В SQL Server 2000 имеется функция NEWIDO, которая генерирует новый глобально уникальный идентификатор. Для генерации идентификатора, в частности, применяются номер сетевой карты и текущее значение времени внутри про цессора в миллисекундах. Сетевым картам присваиваются номера, уникаль 1098 Часть V. Программирование ные в пределах планеты. В совокупности с количеством миллисекунд это по зволяет говорить о том, что вероятность генерации двух одинаковых иденти фикаторов даже в пределах планеты чрезвычайно низка. Глобальные уни кальные идентификаторы активно используются репликацией сведением.

( Замечание ^ Уникальность может быть нарушена при применении эмуляторов сетевых карт, мо демов, работающих как сетевые карты, или других подобных устройств.

• b i t. Как не трудно догадаться, этот тип данных занимает всего 1 бит и часто служит для хранения значений, которые могут принимать всего два значе ния. Примером может служить пол (мужской-женский), женат человек или нет и т. д. Также тип данных b i t активно используется для представления значений "Yes/No", "On/Off", "True/False" И Т. Д.

• cursor. Этот тип данных участвует при работе с курсорами в качестве абст рактного указателя, которому позже может быть сопоставлен конкретный на бор данных. Часто такой подход используется при работе с хранимыми проце дурами. Пользователь создает переменную типа данных cursor и подает ее как параметр на вход хранимой процедуры. Внутри хранимой процедуры создается конкретный курсор, который и сопоставляется внешней переменной. Таким образом, из хранимой процедуры можно передавать наборы данных.

О table. Рассматриваемый тип данных, как и следующий, значительно расши ряют возможности пользователей при работе с Transact-SQL. Это два прин ципиально новых типа данных. Ничего подобного в предыдущих версиях не было. Тип данных t a b l e используется только для переменных и позволяет хранить в них сложные наборы данных. Можно сравнить переменную типа данных t a b l e с временной таблицей. Однако переменная t a b l e может ис пользоваться в качестве параметра хранимой процедуры или функции. Рабо та же с такой переменной осуществляется стандартными средствами, приме няемыми при работе с обычными таблицами, т. е. с помощью команд SELECT, UPDATE, INSERT и DELETE. Объявление переменной типа t a b l e имеет некоторую специфику, т. к. необходимо определить структуру объявляемой переменной. В общем случае объявление переменной t a b l e выполняется точно так же, как и создание таблицы командой CREATE TABLE:

DECLARE @tbl table (GID bigint IDENTITY (1000,1)/ Lname nvarchar(30), Fname nvarchar(30), Sname nvarchar(30), Birth smalldatetime) Работа же с созданной переменной ведется точно так же, как с обычной таб лицей:

INSERT INTO @tbl VALUES ('Степанов1, 'Семенович1, 'Игорь', '1-01-1955') SELECT * FROM @tbl • s q i v a r i a n t. Этот тип данных позволяет хранить значения других типов данных. Тип данных sql_yariant можно использовать как для локальных переменных, так и для столбцов таблиц. Таким образом, в столбце с типом данных s q l v a r i a n t можно хранить целочисленные, строковые величины, а Глава 26. Типы данных SQL Server 2000 также значения с датой и временем. Приведем пример использования типа данных sql_variant:

DECLARE @aa sql_variant, @bb int, @cc nvarchar(10), gdd money SELECT @bb=1010, @cc='String1, @dd=$103. SET @aa=@bb SELECT @aa SET @aa=@cc SELECT @aa SET @aa=@dd SELECT @aa Будет возвращен следующий результат:

Глава Функции SQL Server В SQL Server 7.0 и более ранних версиях в распоряжении пользователя имелся набор встроенных функций, которые писались программистами Microsoft, и набор которых был фиксирован. Пользователь не мог создавать свои собствен ные функции. Конечно, в его распоряжении имелись хранимые процедуры, в качестве которых и можно было реализовывать часто используемые алгоритмы.

Однако очевидным недостатком хранимых процедур является невозможность их применения в выражениях.

При выполнении сложных обновлений или выборки данных, требующих запус ка сложных алгоритмов, не реализуемых в пределах запроса, нужно было ис пользовать курсоры или другие механизмы, позволяющие обращаться к храни мым процедурам. Конечно, было бы гораздо удобнее обращаться к нужным алгоритмам непосредственно в теле запроса, как это происходит при работе со встроенными функциями. Например, можно непосредственно в теле запроса выполнить преобразование типов данных, выделить подстроку из строки, воз вести число в степень, проверить вхождение подстроки в строку и т. д.

В SQL Server 2000 появилась возможность создания определяемых пользователем функций. Таким образом, пользователь может создавать свои собственные функ ции, на которые можно будет ссылаться непосредственно в теле запроса. Как и хранимые процедуры определяемые пользователем функции могут иметь парамет ры. Интересным сочетанием является использование в качестве возвращаемого функцией значения величины типа данных t a b l e. Это дает возможность приме нения запросов, обращающихся непосредственно к функции. Например, если имеется функция Getpeopie, возвращающая список всех людей с фамилией, ука занной с помощью единственного параметра, то просмотр возвращаемого функ цией набора данных можно осуществить с помощью следующей команды:

SELECT * FROM GetPeople('Иванов1) Данная глава будет посвящена рассмотрению как встроенных функций SQL Server 2000, так и созданию и применению определяемых пользователем функций.

Встроенные функции Для начала рассмотрим, какие же функции предлагает SQL Server 2000. Их количе ство достаточно велико, и для удобства работы они разбиты на отдельные группы:

П функции просмотра конфигурации;

О функции для работы с курсорами;

Глава 27. Функции SQL Server 2000 О функции работы с датой и временем;

П математические функции;

• функции метаданных;

• функции подсистемы безопасности;

• строковые функции;

О системные функции;

• статистические функции;

П функции для работы с типами данных image, t e x t и n t e x t.

Многие системные функции начинаются с символов @. Полноценная функция @ должна работать с параметрами, значения которых при ее вызове указываются в скобках после имени функции. В принципе, функция может и не иметь пара метров. В этом случае при ее вызове нужно будет указывать пустые скобки. Не которые же функции Transact-SQL не используют скобки при их вызове. Такие функции скорее можно назвать глобальными переменными. Тем не менее, в документации они все же рассматриваются как функции.

Функции просмотра конфигурации Функции этой группы предназначены для получения различной информации.

Большинство из них являются недетерминированными, т. к. могут возвращать различные результаты при каждом новом вызове. Простейшим примером такой функции является @@DBTS, возвращаемое значение которой постоянно меняется с течением времени. Отметим, что функции не изменяют никаких настроек сер вера, а лишь позволяют просмотреть их. Для изменения тех или иных парамет ров следует обратиться к соответствующим системным хранимым процедурам или командам SET, DBCC И Т. Д. СПИСОК функций группы приведен в табл. 27.1.

Таблица 27.1. Функции просмотра конфигурации Функция Описание SSCONNECTIONS Возвращает целое число, равное количеству попыток соеди нения с SQL Server 2 0 0 0. В это количество входят как у с п е ш ные, так и неудачные попытки @@DATEFIRST Д а н н а я ф у н к ц и я возвращает целое значение от 1 до 7, кото рое показывает, к а к о й день недели сервер считает первым д н е м недели. Д л я и з м е н е н и я этого значения м о ж н о использо вать Команду SET DATEFIRST 8SDBTS Возвращает текущее значение счетчика t i m e s t a m p для те к у щ е й базы данных •@@LANGID Возвращает идентификационный н о м е р языка, установленно го в т е к у щ е м соединении @ @ LANGUAGE Возвращает имя языка, установленного в текущем соединении 1102 Часть V. Программирование Таблица 27.1 (окончание) Описание Функция Возвращает целое значение, соответствующее количеству @@LOCK_TIMEOUT миллисекунд, которое сервер будет ожидать выполнения за проса (тайм-аут). Значение 0 соответствует прерыванию за проса, если сервер обнаруживает, что необходимые для вы полнения этого запроса ресурсы блокированы другими тран закциями. Значение -1 соответствует бесконечному времени ожидания. Время ожидания можно контролировать персо нально для каждого соединения с помощью команды SET LOCKJTIMEOUT Позволяет узнать, какое максимальное количество соедине @@MAX_CONNECTIONS ний могут одновременно устанавливать пользователи с теку щим сервером Можно узнать, какое максимальное количество знаков под @@MAX_PRECISION держивается сервером для типов данных numeric и decimal.

По умолчанию поддерживается точность до 38 знаков, что является максимальным значением @@NESTLEVEL Позволяет узнать текущий уровень вложенности хранимых процедур (функций, триггеров). При каждом вызове хранимой процедуры возвращаемое функцией значение увеличивается на 1, а при завершении процедуры уменьшается на 1. Если не запущено ни одной процедуры, то возвращается значение @@OPTIONS Возвращает информацию о текущих параметрах соединения опциях в виде двухбайтового числа, каждый бит которого со ответствует определенной опции @@REMSERVER Возвращает имя удаленного (remote) сервера, с которого была запущена хранимая процедура. Таким образом, данную функцию следует использовать только из тела хранимой про цедуры @@SERVERNAME Данная функция просто возвращает имя локального сервера SQL Server @@SERVICENAME Возвращает имя ключа реестра, из которого были получены параметры запуска для текущего сервера. Для инсталляции по умолчанию возвращается значение MSSQLServer, а для именованной инсталляции — имя этой инсталляции @@SPID С помощью данной функции можно получить идентификаци онный номер процесса SQL Server 2000, который был присво ен текущему соединению @@TEXTSIZE Позволяет узнать, какое количество байт будет выводить сер вер при выполнении запроса SELECT ДЛЯ данных типа image, n t e x t и t e x t. Управлять количеством возвращаемых байтов можно с помощью команды SET TEXT S I Z E @@VERSION Эта функция возвращает информацию о дате, версии и типе процессора текущей инсталляции SQL Server Глава 27. Функции SQL Server 2000 Функции работы с курсорами Данная группа содержит всего три функции, которые, тем не менее, довольно полезны, а порой и просто незаменимы при работе с курсорами. Подробно ра бота с курсорами будет рассмотрена в главе 31. Тем не менее, в следующих раз делах рассмотрим функции, работающие с курсорами. Список функций группы приведен в табл. 27.2.

Таблица 27.2. Функции работы с курсорами Функция Описание Возвращает целое число типа int, свидетельствующее о количест ве строк, содержащихся в курсоре. Если возвращается значение больше нуля, то оно соответствует количеству строк, содержащихся в курсоре. Когда возвращается ноль, то это означает, что курсор не был открыт. Значение -1 возвращается для динамических курсо ров, которые не имеют постоянного набора данных, т. к. их содер жимое обновляется при каждом обращении к ним. Если же воз вращается значение, меньшее —1, то это значит что соот ветствующий курсор является ключевым и абсолютное значение возвращенного числа соответствует количеству ключей, содержа щихся в курсоре С помощью этой функции можно получить информацию о резуль тате работы последней выполненной команды FETCH. Возвращае мое функцией значение имеет тип данных i n t и может быть одним из следующих:

О — команда FETCH была выполнена успешно, т. е. строка была считана;

-1 — была осуществлена попытка выборки строки, выходящей за пределы курсора. Эта ситуация часто случается при последова тельном сканировании курсора. При достижении конца курсора после выполнения команды FETCH NEXT И будет возвращено зна чение—1;

-2 — это значение возвращается в случае попытки выборки строки, которая по тем или иным причинам стала недоступной. Такая си туация часто встречается во время работы с ключевыми курсорами при изменении в строке ключевых значений. В результате в курсоре имеется ссылка на строку, но по имеющемуся ключу ее уже нельзя идентифицировать Позволяет узнать состояние курсора. Функция CURSOR_STATUS часто используется при работе с курсорами, возвращаемыми с помощью параметров хранимой процедуры. Параметры • l o c a l ' и ' g l o b a l ' указывают тип курсора, о котором необходимо получить информацию — локальный или глобальный соответственно. Нужно явно указать тип курсора, т. к. SQL Server 2000 позволяет создавать одноименные курсоры разных типов. Собственно имя курсора зада ется с помощью параметра ' cursor_name '.

Если же курсор был объявлен как локальная переменная, то для по лучения информации о таком курсоре следует определить параметр ' v a r i a b l e ', а после него через запятую с помощью параметра c u r s o r v a r i a b l e ' указать имя соответствующей переменной.

Рассмотрим, какие значения может возвращать функция, и что они означают:

1 — курсор содержит как минимум одну строку (динамический курсор может не содержать ни одной строки);

О — свидетельствует о том, что курсор открыт, но он не содержит ни одной строки;

—1 — курсор не был открыт;

-2 — курсор по тем или иным причинам не может использоваться.

Часто это значение возвращается для курсоров, объявленных как локальная переменная, и которые должны быть определены в теле хранимой процедуры. Однако при вызове процедуры не было указано ключевое слово OUTPUT;

-3 — указанный курсор не найден Функции работы с датой и временем Как следует из названия, функции данной группы предназначены для работы с датой и временем. Напомним, что для хранения информации о дате и времени в SQL Server 2000 предназначены типы данных datetime и smalidatetime. Не редко возникает необходимость выделить из даты день месяца или год, добавить или отнять несколько дней и т. д. Для выполнения этих, а также многих других операций и существуют функции работы с датой и временем (табл. 27.3).

Таблица 27.3. Функции работы с датой и временем Функция Описание DATEADD(datepart, Данная функция позволяет добавлять к указанной дате опре nuraber, date) деленное количество дней, часов, минут и т. д. С помощью аргумента datepart указывается, какую часть даты необхо димо увеличить. Величина, на которую следует изменить ука занную часть даты, задается с помощью параметра number.

Последний же параметр используется для указания даты, ко торая и будет увеличиваться DATEDIFF (datepart, Возвращает разницу между указанными частями двух дат startdate, enddate) DATENAME ( d a t e p a r t, Выделяет из даты указанную часть и возвращает ее в сим date, вольном формате DATEPART ( d a t e p a r t, Выделяет из даты указанную часть и возвращает ее в число date) вом формате DAY (date) С помощью функции DAY можно извлечь номер дня месяца из значения datetime или smalldatetime. Результат имеет тип данных i n t GET DATE () С помощью этой функции можно получить информацию о текущем системном времени. Возвращаемое значение имеет тип данных datetime ISDATE (expression) С помощью этой функции можно проверить, является ли указан ное строковое выражение датой или нет. Если указанное выраже ние является одним из допустимых вариантов записи даты и вре мени, то возвращается 1, иначе будет возвращено значение О MONTH (date) Эта же функция возвращает месяц из указанной даты. Ре зультат имеет тип данных i n t YEAR (date) По аналогии с двумя предыдущими функциями с помощью функции YEAR можно извлечь из даты год. Возвращаемое значение имеет тип данных i n t Математические функции Функции этой группы предназначены для выполнения различных математиче ских операций — возведение в степень, вычисление синуса, извлечение корня и т. д. Список математических функций приведен в табл. 27.3.

При работе с математическими функциями следует быть внимательным с типа ми данных. Дело в том, что некоторые функции SQL Server 2000 возвращают значение того же типа, что и исходное выражение. Поясним сказанное на при мере использования функции RADIANS ДЛЯ перевода угла 45° в радианы:

SELECT RADIANS(45), RADIANS(45.0), RADIANS(45.00000) Будет возвращен следующий результат:

0.785398163397448300,. (1 row(s) affected) Таблица 27.3. Математические функции Функция Описание ABS(numericexpression) Возвращает абсолютное значение выражения, т.е.



Pages:     | 1 |   ...   | 27 | 28 || 30 | 31 |   ...   | 33 |
 





 
© 2013 www.libed.ru - «Бесплатная библиотека научно-практических конференций»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.