Типы данных и преобразование типов.
Встроенные и определённые пользователем типы данных хранятся в текущей базе данных в таблице systypes и могут быть просмотрены командой
SELECT * FROM systypes
- Бинарные: требуется указывать числа в 16-ричном виде, например 0хFF.
binary(n) – n определяет количество байт для хранения (до 8000 байт); под каждое значение будет выделено указанное количество байт вне зависимости от фактических размеров данных.
varbinary(n) – n определяет максимальное количество байт для хранения (до 8000 байт); если массив данных m<n, то фактически отводится m+4 байта, если m>n, то данные усекаются до размера поля.
image – хранятся бинарные данные размером до 231-1 байт (~2 Гбайт), память выделяется страницами по 8000 байт. Использование этого поля оправдано, если требуется хранить очень длинные данные. Специальных функции отображения содержимого полей этого типа SQL Server не имеет.
Пример:
DECLARE @VA binary(10), @VB varbinary(10)
SELECT @VA = 0xFF, @VB= 0xAC
SELECT 'Значение переменной VA: ' = @VA, 'Значение переменной VB: ' = @VB
SELECT 'Длина VA: ' = DATALENGTH(@VA), 'Длина VB: ' = DATALENGTH(@VB)
- Символьные: интерпретируются в зависимости от того, какая кодовая страница была установлена при инсталляции сервера.
char(n) – n<=8000, ASCII символы (1 байт), резервируется всегда n символов, если размер данных меньше, строка дополняется пробелами справа.
varchar(n) – то же что и char(n), но резервируется максимум n символов. Если размер данных m<n, то дополнения пробелами не происходит.
nchar(n) – n<=4000, Unicode символы (2 байта), остальное как в char(n).
nvarchar(n) – n<=4000, Unicode символы (2 байта), остальное как в varchar(n).
Примеры:
DECLARE @name nvarchar(25)
SET @name = N'Д''Артаньян'
SELECT @name
-- Что получится в каждом из столбцов?
SELECT 1+1,'1'+'1','1'+'2'+3
Типичные функции для работы со строками:
LEN(…) – возвращает длину строки в символах;
LTRIM(…) и RTRIM(…) – удаляет пробелы в начале и в конце строки
SUBSTRING(…) – возвращает подстроку из строки
REPLACE(…) – заменяет подстроку указанным значением
- Текстовые:
позволяют хранить достаточно большие объёмы текстовой информации
text – хранение ASCII текстовых блоков размером <=231-1 символов (~2 Гбайт), выделяемых постранично.
ntext – хранение Unicode текстовых блоков размером <=230-1 символов (~1 Гбайт), выделяемых постранично.
Некоторые функции для работы с текстовыми полями:
SUBSTRING(…) – возвращает подстроку текстового поля;
READTEXT(…) – считывает данные из текстового поля;
DATALENGTH(…) – возвращает количество байт, занимаемых данными;
- Целочисленные: следует учитывать, что результат вычисления выражения приводится к типу данных, имеющих максимальный размер из всех участвующих в выражении. Результатом деления целого на целое будет целое с отброшенной дробной частью.
tinyint – диапазон данных от 0 до 255 (длина поля 1 байт).
smallint – диапазон данных от -215 до 215-1 (длина поля 2 байта).
intили integer – диапазон данных от -231 до 231-1 (длина поля 4 байта).
bigint – диапазон данных от -263 до 263-1 (длина поля 8 байт).
- Нецелочисленные: с фиксированной и плавающей точкой.
dec или decimal [(p[,s])] или numeric [(p[,s])] – диапазон от –(1038-1) до (1038-1). Содержит фиксированное количество знаков до и после точки: p – общее число знаков, s – число знаков после точки (0 <= s <= p <= 38). Длина поля от 5 до 17 байт.
float [(n)] – число в виде мантиссы и порядка. Максимальный диапазон от -1.79308 до 1.79308. Значение n определяет количество бит, используемых для хранения мантиссы (n<=53). Длина поля 4 или 8 байт.
double precision – частный случай float(53).
real– частный случай float(24). Диапазон данных от -3.438 до 3.438.
Примеры:
DECLARE @VR real
SET @VR=1.23E4
SELECT @VR, DATALENGTH(@VR)
Не рекомендуется указывать нецелочисленные типы данных в конструкциях WHERE и для построения индексов или первичных ключей, так как скорость обработки таких полей существенно ниже чем целочисленных
Преобразование типов данных из числа в строку:
DECLARE @VR float, @VS varchar(20)
SET @VR=3.14
SET @VS=STR(@VR,4,2)+'15' – простая функция преобразования типов
SELECT @VS
SET @VS=CAST($123.45 AS varchar(10)) – универсальная функция преобразования
SELECT @VS
SELECT CAST ('$54321' AS money)
Взаимозаменяемой для функции CAST является функция CONVERT
Некоторые функции для работы с числовыми типами:
ISNUMERIC(…) – проверяет, имеет ли выражение числовой тип данных (1, если да);
RAND() – вычисляет случайное число с плавающей точкой в диапазоне [0…1];
POWER(…) – возведение числа в степень (SELECT power(2,8) );
PI(…) – возвращает значение Пи.
- Даты и времени: типы данных позволяют одновременно хранить время и дату.
datetime – В первых 4 байтах хранится смещение относительно 1 января 1753 г. (до этого летоисчисление шло по Григорианскому и Юлианскому календарям) до 31.12.9999. Последние 4 байта – время после полуночи с точностью 3.33 мс.
smalldatetime – диапазон от 1.01.1900 до 6.06.2079 с точностью до 1 мин.
Дополнительные возможности для ввода и вывода дат предоставляет команда
SET DATEFORMAT xxx, где xxx может быть: mdy, dmy, ymd, ydm, myd, dym.
Примеры:
SET LANGUAGE 'русский'
DECLARE @DV datetime
SET @DV='21 октябрь 2003 23:19'
SELECT @DV
Функция ISDATE(<выражение>) возвращает 1, если <выражение> может быть правильно конвертировано в дату, и 0 в противном случае.
Некоторые функции для работы с датой и временем:
GETDATE() – возвращает текущее системное время;
YEAR(…) – возвращает год из указанной даты;
DATEADD(…) – добавляет к дате указанный временной интервал
SELECT year(getdate())
DECLARE @Str1 char(10)
IF DAY(GETDATE())<15 SET @Str1='первая'
ELSE SET @Str1='вторая'
SELECT 'Сейчас '+RTRIM(@Str1)+' половина месяца'
- Денежные: поддерживается точность 4 знака после десятичной точки.
money – диапазон от -922 337 203 685 477.5808 до +922 337 203 685 477.5807, длина 8 байт.
smallmoney – диапазон от -214 748.3648 до +214 748.3647, длина 4 байта.
Примеры:
CREATE TABLE MyMoney (
ID bigint IDENTITY (1,1) PRIMARY KEY,
Value money NULL
)
INSERT MyMoney VALUES ($127.35)
SELECT * FROM MyMoney
Специальные:
bit – данные принимают значения 0 / 1 / NULL. Память выделяется побайтно.
timestamp – счетчик-идентификатор записей, уникальный в пределах одной базы данных (не имеет ничего общего с меткой времени). Длина 8 байт. Не может использоваться для объявления переменных. Не должен использоваться в составе первичного ключа.
uniqueidentifier – глобально уникальный идентификатор записи (GUID). Идентификатор уникален в масштабе планеты. Представляет собой 16-байтовую последовательность, составляющуюся с помощью функции NEWID() из MAC-адреса сетевой карты и внутреннего таймера процессора.
sysname – предназначен для хранения имён объектов баз данных SQL Server – столбцов, таблиц, индексов, представлений, хранимых процедур и др.
sql_variant – позволяет в одном и том же столбце хранить значения любого другого доступного типа данных (за исключением text, ntext, image, timestamp, cursor, table и самого sql_variant)
Пример:
DECLARE @Var1 int, @Var2 nvarchar(15), @Var3 datetime, @VA sql_variant
SET @Var1=10
SET @Var2='Просто строка'
SET @Var3='23.08.1969'
SET @VA=@Var1+5
SELECT @VA
SET @VA=@Var2
SELECT @VA
SET @VA=@Var3
SELECT @VA
Функция SQL_VARIANT_PROPERTY возвращает информацию о природе данных, хранящихся под типом sql_variant.
cursor – ссылка на объект базы данных – курсор. Подробнее о курсорах см. далее.
table – временная таблица (массив). Может использоваться только для переменных и значений, возвращаемых функциями пользователя.
Пример:
DECLARE @VarTable TABLE (
Col1 int NOT NULL IDENTITY (1,1) PRIMARY KEY,
Col2 nvarchar(15)
)
INSERT INTO @VarTable (Col2) VALUES ('Первая строка')
SELECT * FROM @VarTable
- Пользовательские типы данных: также возможно создавать в MS SQL Server. Для этих целей предусмотрена специальная хранимая процедура sp_addtype. Первым параметром при вызове этой процедуры указывается имя пользовательского типа, вторым – имя системного типа, на основе которого строится пользовательский. Третий параметр указывает, разрешены или запрещены значения NULL. Пример:
sp_addtype nvc15, ’nvarchar(15)’, NONULL
Дата добавления: 2015-07-30; просмотров: 848;