Типы данных SQL Server 2000

 

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

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

В SQL Server 2000 набор типов данных несколько расширен по сравнению с пре­дыдущей версией SQL Server – добавлены типы данных bigint, table и sql_variant. В итоге в распоряжении пользователей имеется набор из встроенных типов данных:

bigint целочисленный тип данных, занимающий 8 байт;

float – нецелочисленный тип данных приблизительной точности;

ntext – текстовые данные Unicode длиной до 1 Гбайта;

int – целочисленный тип данных, занимающий 4 байта;

real – нецелочисленный тип данных приблизительной точности;

binary – двоичные данные фиксированной длины до 8000 байт;

smallint – целочисленный тип данных, занимающий 2 байта;

datetime – дата и время высокой точности (8-байтовый);

varbinary – двоичные данные переменной длины до 8000 байт;

tinyint – целочисленный тип данных, занимающий 1 байт;

smalldatetime – дата и время низкой точности (4-байтовый);

image – двоичные данные длиной до 2 Гбайт;

bit – один бит, принимает значение либо 0, либо 1;

char – символьные данные не Unicode фиксированной длины до 8000 символов;

decimal – нецелочисленный тип данных фиксированной точности;

varchar – символьные данные не Unicode переменной длины до 8000 символов;

timestamp – временной штамп или версия строки;

numeric – нецелочисленный тип данных фиксированной точности

text – текстовые данные не Unicode длиной до 2 Гбайт;

sql_variant – тип данных, позволяющий хранить значения других типов данных;

money – денежный тип данных высокой точности (8-байтовый);

nchar – символьные данные Unicode фиксированной длины до 4000 символов;

smallmoney – денежный тип данных низкой точности (4-байтовый);

nvarchar – символьные данные Unicode переменной длины до 4000 символов;

uniqueidentifier – тип данных, предназначенный для хранения глобальных уникальных идентификаторов.

На основе некоторых из них могут быть созданы новые типы данных, называемые пользовательскими (user-defined). Примером та­кого типа данных может служить тип sysname (основанный на nvarchar(l28)), активно применяемый в системных таблицах для хранения имен объектов.

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

- целочисленные (Integers) – bigint, int, smallint и tinyint;

- нецелочисленные (Decimal) – decimal, numeric, float и real;

- денежные (Money) – money и smallmoney;

- дата и время (Date and Time) – datetime и smalldatetime;

- двоичные (Binary) – binary, varbinary и image;

- строковые (String) – char, varchar, nchar и nvarchar;

- текстовые (Text) – text и ntext;

- специальные (Specials) – timestamp, uniqueidentifier, bit, cursor, table и sql variant.

 

Функции SQL Server 2000

 

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

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

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

SELECT * FROM GetPeople(‘Иванов’)

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

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

- функции для работы с курсорами. Данная группа содержит всего три функции, которые тем не менее довольно полезны, а порой и просто незаменимы при работе с курсорами;

- функции работы с датой и временем. Как следует из названия, функции данной группы предназначены для работы с датой и временем. Напомним, что для хранения информации о дате и времени в SQL Server 2000 предназначены типы данных datetime и smalldatetime. Не­редко возникает необходимость выделить из даты день месяца или год, добавить или отнять несколько дней и т.д.;

- математические функции. Функции этой группы предназначены для выполнения различных математиче­ских операций – возведение в степень, вычисление синуса, извлечение корня и т.д.;

- функции метаданных. Эти функции предназначены для получения сведений о различных объек­тах SQL Server 2000 (метаданных);

- функции подсистемы безопасности. Функции этой группы служат для получения информации, связанной с подсис­темой безопасности – пользователях и учетных записях, о членстве их в фикси­рованных и пользовательских ролях базы данных, фиксированных ролях сервера и другой информации;

- строковые функции. Функции этой группы предназначены для работы с символьными строками – поиска подстроки в строке, выделения подстроки, удаления лидирующих и конечных пробелов, вычисления длины строки и т.д.;

- системные функции. Судя по названию, функции этой группы предназначены для получения самой разнообразной ин­формации, которая, должна быть системной. Однако некоторые из функций группы, скорее, можно назвать функциями общего поль­зования, чем системными;

- статистические функции. Функции этой группы возвращают различную статистическую информацию о работе сервера – об операциях чтения диска, количестве переданной по сети информации, затратах времени и т.д.;

- функции для работы с типами данных image, text и ntext.

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