无法使用特殊主体sa:使用特殊数据

="t18">特殊数据类型是指那些不适合其它数据类型分类数据类型例如若要将客户调查中"是"或"否"值相应地用 1 或 0 进行存储则可使用 bit 数据类型Microsoft® SQL Server™ 2000 在该分类中有几个数据类型:

bit
bit 数据不必放在单引号中它是和 SQL Server 整型和数字数据相似数字数据但 bit 列只能存储 0 和 1

sql_variant
SQL Server 中 sql_variant 数据类型允许单个列、参数或变量存储区别数据类型数据值sql_variant 列每个例子都记录数据值和描述该值元数据:该值基本数据类型、最大大小、小数位数、精度和排序规则

下例中第 2个表包含个 sql_variant 列:

CREATE TABLE ObjectTable
(ObjectID
CONSTRAINT PKObjectTable PRIMARY KEY,
ObjectNamenvarchar(80),
ObjectWeightdecimal(10,3),
ObjectColornvarchar(20)
)

CREATE TABLE VariablePropertyTable
(ObjectID REFERENCES ObjectTable(ObjectID),
PropertyNamenvarchar(100),
PropertyValuesql_variant,
CONSTRAINT PKVariablePropertyTable
PRIMARY KEY(ObjectID, PropertyName)
)

若要获得任何个特定 sql_variant 例子元数据信息请使用 SQL_VARIANT_PROPERTY

table
table 数据类型类似是个临时表可以用于存储个结果集以便以后处理这种数据类型只能用于定义 table 类型局部变量和用户定义返回值

个 table 变量或返回值定义包括列、数据类型、精度、每列小数位数以及可选 PRIMARY KEY、UNIQUE 和CHECK 约束

存储在 table 变量中或用户定义返回值中格式必须在声明变量或创建时定义其语法基于 CREATE
TABLE 语法例如:

DECLARE @TableVar TABLE
(Cola 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 variable 或 CREATE FUNCTION 语句部分不得过后再使用它
CREATE INDEX 或 ALTER TABLE 语句不能引用表变量和用户定义

有关用于定义 table 变量和用户定义语法更多信息请参见 DECLARE @local_variable (T-SQL) 和 CREATE
FUNCTION (T-SQL)

timestamp
SQL Server timestamp 数据类型和时间和日期无关SQL Server timestamp 是 2进制数字它表明数据库中数据修改发生相对顺序实现 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 列

若要记录表中发生数据修改次数可用 datetime 或 smalldatetime 数据类型来记录这些事件和触发器这样当发生修改时就可以自动更新其值

用户定义数据类型
用户定义数据类型使您得以使用针对特定用途定制描述性名称和格式来扩展 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
(EmployeeIDINT PRIMARY KEY,
EmployeeSSNSSN,
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 列用作索引特别使聚集索引中如果 SSN 用户定义数据类型是使用 数据类型实现则键大小可以从 11 个字节缩减到 4 个字节这种键大小缩减能改善数据检索提高数据检索效率以及避免要求 CHECK 约束点通常比显示或修改 SSN 值时进行从 格式额外转换处理更为重要
Tags: 

延伸阅读

最新评论

发表评论