Использование специальных данных
Типы специальных данных не подходят ни к одной из других категорий типов данных. Например, для хранения данных в виде значений 0 или 1, которые соответствуют ответам «да» или «нет» в опросе клиентов, используйте тип данных bit. Microsoft SQL Server 2005 содержит несколько соответствующих этой категории типов данных:
bit
Данные типа bit не должны быть заключены в одинарные кавычки. Данные такого типа являются числовыми данными, схожими с числовыми и целочисленными данными SQL Server, за исключением того, что столбцы типа bit могут содержать лишь значения 0 и 1.Строковые значения true и false можно преобразовать в значения типа bit, как показано ниже:
SELECT CONVERT (bit, 'true'), CONVERT(bit, 'false')
Значение True преобразуется в 1, а значение False преобразуется в 0.
sql_variant
Тип данных sql_variant в SQL Server позволяет сохранять данные различных типов в одном столбце, параметре или переменной. В каждом экземпляре столбца типа sql_variant хранятся значения данных и метаданные, описывающие эти значения: его основной тип данных, максимальный размер, масштаб, точность и параметры сортировки.Вторая таблица в следующем примере содержит столбец sql_variant:
CREATE TABLE ObjectTable (ObjectID int CONSTRAINT PKObjectTable PRIMARY KEY, ObjectName nvarchar(80), ObjectWeight decimal(10,3), ObjectColor nvarchar(20)) CREATE TABLE VariablePropertyTable (ObjectID int REFERENCES ObjectTable(ObjectID), PropertyName nvarchar(100), PropertyValue sql_variant, CONSTRAINT PKVariablePropertyTable PRIMARY KEY(ObjectID, PropertyName))
Чтобы получить метаданные для любого конкретного экземпляра sql_variant, используйте функцию SQL_VARIANT_PROPERTY.
sysname
Экземпляры SQL Server включают пользовательский тип данных, называемый sysname. sysname используется для столбцов таблицы, переменных и параметров хранимых процедур, которые хранят имена объектов. Точное определение sysname зависит от установленных для идентификаторов правил именования; таким образом, оно может быть различным для различных экземпляров SQL Server. sysname функционально эквивалентен типу nvarchar(128). SQL Server версии 6.5 и более ранней поддерживает только меньшие идентификаторы; таким образом, в ранних версиях sysname определяется как varchar(30).Важно!
В базах данных, учитывающих регистр, или использующих двоичный параметр сортировки, тип данных sysname определяется как системный тип данных SQL Server лишь тогда, когда он введен в нижнем регистре.
table
Тип данных table подобен временным таблицам и может использоваться для хранения результирующего набора для дальнейшей обработки. Этот тип данных может использоваться только для определения локальных переменных типа table и значений, возвращаемых пользовательской функцией.Определение табличной переменной или возвращаемого значения включает определения столбцов, типа данных, точности и размера каждого столбца, необязательных ограничений PRIMARY KEY, UNIQUE, NULL или CHECK. Пользовательский тип данных нельзя использовать в качестве типа данных.
Формат строк, хранимых в переменной table или возвращаемых пользовательской функцией, должен быть определен при объявлении переменной или при создании функции. Синтаксис основан на синтаксисе инструкции CREATE TABLE. Например:
DECLARE @TableVar TABLE (Cola int PRIMARY KEY, Colb char(3)) INSERT INTO @TableVar VALUES (1, 'abc') INSERT INTO @TableVar VALUES (2, 'def') SELECT * FROM @TableVar GO
Переменные table и пользовательские функции, которые возвращают table, можно использовать в определенных инструкциях SELECT и INSERT и в инструкциях UPDATE, DELETE и DECLARE CURSOR, поддерживающих таблицы. Переменные table и пользовательские функции, которые возвращают table, нельзя использовать в инструкциях Transact-SQL.
Индексы и другие применимые к таблице ограничения задаются как часть переменной DECLARE в инструкции CREATE FUNCTION. Они не могут быть применены позднее, потому что инструкции CREATE INDEX и ALTER TABLE не могут ссылаться на табличные переменные и пользовательские функции.
Дополнительные сведения о синтаксисе, используемом для определения переменных и пользовательских функций типа table, см. в разделах DECLARE @local\_variable (Transact-SQL) и CREATE FUNCTION (Transact-SQL).
timestamp
Тип данных SQL Server timestamp не связан со временем или с датой. Значения SQL Server timestamp являются двоичными числами, указывающими относительную последовательность, в которой происходило изменение данных в базе данных. Изначально тип данных timestamp был введен для поддержки алгоритмов восстановления SQL Server. Каждый раз при изменении страницы она маркировалась текущим значением величины DBTS, и это значение увеличивалось на единицу. Это позволяло алгоритму восстановления определить относительную последовательность, в которой изменялись страницы, но значения timestamp не имели никакого отношения ко времени.В SQL Server версии 7.0 и в SQL Server 2000 @@DBTS увеличивается на 1 только при использовании в столбцах timestamp. Если таблица содержит столбец типа timestamp, то каждый раз при изменении строки в результате выполнения инструкций INSERT, UPDATE и DELETE значение timestamp в строке устанавливается в текущее значение @@DBTS, а затем значение @@DBTS увеличивается на 1.
Никогда не используйте столбцы timestamp в качестве ключей, особенно первичных ключей, потому что значение timestamp изменяется всякий раз при изменении строки.
Чтобы записывать время, когда происходило изменение данных в таблице, используйте либо тип данных datetime, либо smalldatetime для записи событий, а триггеры для автоматического обновления значений — всякий раз, когда происходят изменения.
Псевдонимы типов данных
Псевдонимы типов данных позволяют расширить базовые типы данных SQL Server (например, varchar) содержательным именем и форматом, приспособленным для конкретного использования. Например, эта инструкция создает пользовательский тип данных birthday, допускающий значения NULL, используя в качестве базового тип данных datetime:EXEC sp_addtype birthday, datetime, 'NULL'
Будьте внимательны при выборе базовых типов, применяемых для пользовательских типов. Например, в США номера социального страхования (SSN) имеют формат nnn-nn-nnnn. Хотя номера социального страхования содержат числа, эти числа образуют идентификатор, и к ним нельзя применять математические операции. Поэтому обычно определяется пользовательский тип данных varchar для номера социального страхования и создается проверочное ограничение, чтобы обеспечить необходимый формат номера социального страхования:
EXEC sp_addtype SSN, 'VARCHAR(11)', 'NOT NULL' GO CREATE TABLE ShowSSNUsage (EmployeeID int PRIMARY KEY, EmployeeSSN SSN, CONSTRAINT CheckSSN CHECK ( EmployeeSSN LIKE '[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' ) ) GO
Если столбцы SSN используются в качестве ключевых столбцов в индексах, особенно в кластеризованных индексах, то размер ключей можно сократить с 11 байт до 4 байт, если пользовательский тип данных SSN определен с использованием базового типа данных int. Уменьшение размера ключа улучшает извлечение данных. Улучшение эффективности извлечения данных и устранение необходимости проверочного ограничения CHECK обычно перевешивают издержки, связанные с преобразованием типа int к символьному формату при отображении или изменении значений SSN.
См. также
Другие ресурсы
CREATE FUNCTION (Transact-SQL)
Типы данных (Transact-SQL)
DECLARE @local\_variable (Transact-SQL)
SQL_VARIANT_PROPERTY (Transact-SQL)
table (Transact-SQL)