使用特殊數據
2024-07-21 02:10:51
供稿:網友
特殊數據類型是指那些不適合其它數據類型分類的數據類型。例如,若要將客戶調查中"是"或"否"的值相應地用 1 或 0 進行存儲,則可使用 bit 數據類型。microsoft® sql server™ 2000 在該分類中有幾個數據類型:
bit
bit 數據不必放在單引號中。它是與 sql server 的整型和數字數據相似的數字數據,但 bit 列只能存儲 0 和 1。
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 函數。
table
table 數據類型類似是一個臨時表,可以用于存儲一個結果集以便以后處理。這種數據類型只能用于定義 table 類型的局部變量和用戶定義函數的返回值。
一個 table 變量或返回值的定義包括列、數據類型、精度、每列的小數位數以及可選的 primary key、unique 和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 variable 或 create function 語句的一部分。不得過后再使用它
們,因為 create index 或 alter table 語句不能引用表變量和用戶定義的函數。
有關用于定義 table 變量和用戶定義函數的語法的更多信息,請參見 declare @local_variable (t-sql) 和 create
function (t-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 列。
若要記錄表中發生的數據修改次數,可用 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
(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 列用作索引,特別使聚集索引中的鍵,如果 ssn 用戶定義數據類型是使用 int 數據類型實現的,則鍵的大小可以從 11 個字節縮減到 4 個字節。這種鍵的大小的縮減能改善數據檢索。提高數據檢索效率以及避免要求 check 約束,這一點通常比顯示或修改 ssn 值時進行從 int 到字符格式的額外的轉換處理更為重要。