使用特殊数据

特殊数据类型是指那些不适合其他任何数据类型类别的数据类型。例如,若要将客户调查中“是”或“否”值对应的数据分别存储为 1 或 0,可使用 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 Server 中的 sql_variant 数据类型允许单个列、参数或变量存储不同数据类型的数据值。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 的各个实例会有所不同。sysnamenvarchar(128) 作用相同。SQL Server 6.5 或早期版本仅支持较小的标识符;因此,在早期版本中,sysname 被定义为 varchar(30)

    ms191240.note(zh-cn,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
    

    只能在某些 SELECT 和 INSERT 语句中使用返回 tabletable 变量和用户定义函数,其中在 UPDATE、DELETE 和 DECLARE CURSOR 语句中支持表。不能在任何其他 Transact-SQL 语句中使用返回 tabletable 变量和用户定义函数。

    必须将应用到表的索引或其他约束定义为 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 值对该页做一次标记,@@DBTS 值每次递增 1。这足以帮助恢复过程确定页被修改的相对顺序,但是 timestamp 值与时间没有任何关系。

    在 SQL Server 7.0 和 SQL Server 2000 中,仅增加 @@DBTS 以在 timestamp 列中使用。如果表包含 timestamp 列,则每次通过 INSERT、UPDATE 或 DELETE 语句修改行时,便会将行中的 timestamp 值设置为当前 @@DBTS 值,然后 @@DBTS 将以 1 递增。

    从不在键(尤其是主键)中使用 timestamp 列,因为每次修改行时,timestamp 值都会更改。

    若要记录表中的数据修改次数,请使用 datetimesmalldatetime 数据类型记录事件和触发器以在进行修改时自动更新值。

  • 别名数据类型
    别名数据类型使您可以用针对特定用途定制的描述性名称和格式来扩展 SQL Server 基本数据类型(例如 varchar)。例如,以下语句实现了一个 birthday 用户定义数据类型,它允许 NULL,并使用了 datetime 基本数据类型:

    EXEC sp_addtype birthday, datetime, 'NULL'
    

    选择实现用户定义数据类型的基类型时,请谨慎从事。例如,在美国,社会保障号的格式为 nnn-nn-nnnn。当社会保障号包含数字时,数字会形成标识符并且无法进行数学运算。因此,通常将用户定义的社会保障号数据类型创建为 varchar,并且创建 CHECK 约束以强制执行存储在表中的社会保障号的格式:

    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 列用作索引(尤其是聚集索引)中的键列,并且使用 int 基本数据类型实现 SSN 用户定义类型,则可将键的大小从 11 个字节收缩到 4 个字节。键大小的这种减小改善了数据检索。与显示或修改 SSN 值时进行从 int 到字符格式的额外转换处理相比,提高数据检索效率以及避免使用 CHECK 约束通常更为重要。

请参阅

其他资源

CREATE FUNCTION (Transact-SQL)
数据类型 (Transact-SQL)
DECLARE @local\_variable (Transact-SQL)
SQL_VARIANT_PROPERTY (Transact-SQL)
表 (Transact-SQL)

帮助和信息

获取 SQL Server 2005 帮助