Поделиться через


Использование специальных данных

Типы специальных данных не подходят ни к одной из других категорий типов данных. Например, для хранения данных в виде значений 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).

    ms191240.note(ru-ru,SQL.90).gifВажно!
    В базах данных, учитывающих регистр, или использующих двоичный параметр сортировки, тип данных 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)

Справка и поддержка

Получение помощи по SQL Server 2005