В предыдущей главе рассматривалось использование переменных. При объявлении переменной с помощью команды 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 не используют скобки при их вызове. Такие функции точнее можно назвать глобальными переменными. Тем не менее в документации они все же рассматриваются как функции