使用特殊数据类型

本主题介绍在 SQL Server 中可用的特殊数据类型。特殊数据类型是指那些不适合其他任何数据类型类别的数据类型。在 SQL Server 中,特殊数据类型包括 bit、hierarchyid、sql_variant、sysname、table、timestamp 和别名数据类型。

bit

bit 数据类型是一个存储 0 或 1 的数值数据类型。字符串值 true 和 false 可转换为 bit 值,如下面的示例所示:

SELECT CONVERT (bit, 'true')
SELECT CONVERT(bit, 'false')

在此示例中,true 被转换为 1,false 被转换为 0。bit 数据无需用单引号括起来。

hierarchyid

hierarchyid 数据类型用于管理具有层次结构的层次结构数据和表。若要在 Transact-SQL 代码中处理层次结构数据,请使用 hierarchyid 函数。有关详细信息,请参阅使用 hierarchyid 数据类型(数据库引擎)

sql_variant

sql_variant 数据类型允许单个列、参数或变量存储不同数据类型的数据值。sql_variant 列的每个实例均记录数据值和说明此值的元数据。有以下元数据可用:

  • 基本数据类型

  • 最大大小

  • 小数位数

  • 精度

  • 排序规则

若要检索特定 sql_variant 实例的元数据,请使用 SQL_VARIANT_PROPERTY 函数。

在下面的示例中,第二个表包含 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))

sysname

sysname 数据类型用于表列、变量以及用于存储对象名的存储过程参数。sysname 的精确定义与标识符规则有关。因此,它可能会因 SQL Server 实例的不同而有所不同。除了 sysname 在默认情况下为 NOT NULL 之外,sysname 的功能与 nvarchar(128) 相同。在早期版本的 SQL Server 中,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

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

必须将应用到表的索引或其他约束定义为 DECLARE 变量或 CREATE FUNCTION 语句的一部分。以后不能应用这些索引和约束,因为 CREATE INDEX 或 ALTER TABLE 语句不能引用表变量和用户定义函数。

有关用于定义 table 变量和用户定义函数的语法的详细信息,请参阅 DECLARE @local_variable (Transact-SQL)CREATE FUNCTION (Transact-SQL)

timestamp

timestamp 数据类型与时间和日期无关。timestamp 值是二进制数值,表明数据库中的数据修改发生的相对顺序。

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

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

别名数据类型

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

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 约束通常更为重要。