使用者定義表型別

2022-02-24 17:13:10 字數 3815 閱讀 5206

**:

sql server2008微軟資料庫系統,

它在資料庫引擎中的可程式設計性增強功能包括

新資料儲存功能、

新資料型別、

新全文搜尋體系結構以及

對 transact-sql 所做的許多改進和新增。

1.使用者定義表型別

1.1簡介

sql server 2008中,使用者定義表型別是指使用者所定義的表示表結構定義的型別。

您可以使用使用者定義表型別為儲存過程或函式宣告錶值引數,或者宣告您要在批處理中或在儲存過程或函式的主體中使用的表變數。 

若要建立使用者定義表型別,請使用create type語句。為了確保使用者定義表型別的資料滿足特定要求,您可以對使用者定義表型別建立唯一約束和主鍵。

1.2使用例題

在建立使用者定義表型別前先建立乙個測試表testtable

create table testtable( 

ids int identity, 

name nvarchar(100), 

age int, 

zip nvarchar(100) 

) 然後建立乙個使用者定義表型別atype 

create

type atype as table 

( name nvarchar(100) default(''), 

age int 

)在microsoft sql server 2008的sql server

management studio看到的結果如下:

現在我們開始使用使用者定義表型別

(1)簡單應用

--宣告乙個變數@t,型別為atype 

declare @t atype

--往變數@t中插入2條資料 

insert into @t (name,age) 

select 'a',22 

union all 

select 'b',33

--顯示變數@t中資料 

select * from @t

--利用型別為atype的變數@t往testtable表中插入資料 

insert into testtable(name,age,zip) 

select name,age,'zip' 

from @t

--查詢表testtable 

select * from testtable

(2)結合儲存過程應用

先建立乙個儲存過程

create

proc pr_inset 

@type atype readonly 

as insert into testtable(name,age,zip) 

select name,age,'zip' 

from @type 

return

注意:@type引數必須帶關鍵字readonly,指示不能在過程的主體中更新或修改引數。如果引數型別為使用者定義的表型別,則必須指定 readonly。

--宣告乙個變數@t1,型別為atype 

declare @t1 atype

--往變數@t1中插入2條資料 

insert into @t1 (name,age) 

select 'a1',11 

union all 

select 'b2',44

--呼叫過程pr_inset,並傳遞型別為atype的變數@t1 

execute pr_inset @t1

--查詢表testtable 

select * from testtable

1.3使用限制

請注意,使用者定義表型別使用有以下限制: 

1.在建立使用者定義表型別定義後不能對其進行修改。(沒搞懂為什麼不可以修改) 

2.不能在使用者定義表型別的計算列的定義中呼叫使用者定義函式。 

3.無法對使用者定義表型別建立非聚集索引,除非該索引是對使用者定義表型別建立primary key 或unique約束的結果。 

4.使用者定義表型別不能用作表中的列或結構化使用者定義型別中的字段。

2.日期,時間資料型別

sqlserver 2008增加了四個新的日期和時間資料型別: 

(1) time定義一天中的某個時間。此時間不能感知時區且基於 24 小時制 

(2) date定義乙個日期 

(3) datetime2是對現有datetime型別的擴充套件,其資料範圍更大,預設的小數精度更高,並具有可選的使用者定義的精度 

(4) datetimeoffset用於定義乙個與採用 24 小時制並可識別時區的一日內時間相組合的日期。其資料範圍與datetime2一致,但是其多了乙個時區偏移量

詳細情況可以看如下:

來段sql,看看各型別的效果:

select

convert(time, '01:01:01.1234567 pm') as 'time' , 

convert(date,'2008-08-08') as 'date' , 

convert(datetime2(7), '2008-08-08

20:00:00. 1234567 +12:15'  ) as 'datetime2', 

convert(datetimeoffset(7), '2008-08-08

20:00:00.1234567 +12:15' )  as     

'datetimeoffset'

結果如下:

再看看幾個新增加的函式:

--sysdatetime:返回包含計算機的日期和時間的 datetime2(7) 值,sql server 的例項正在該計算機上執行。 

--時區偏移量未包含在內。 

select sysdatetime() as 'sysdatetime';

--sysdatetimeoffset:返回包含計算機的日期和時間的 datetimeoffset(7) 值,sql server 的例項正在該計算機上執行。 

--時區偏移量包含在內。 

select sysdatetimeoffset() as 'sysdatetimeoffset';

--sysutcdatetime:返回包含計算機的日期和時間的 datetime2(7) 值,sql server 的例項正在該計算機上執行。 

--日期和時間作為 utc 時間(通用協調時間)返回。 

select sysutcdatetime() as 'sysutcdatetime';

--current_timestamp:返回包含計算機的日期和時間的 datetime2(7) 值,sql server 的例項正在該計算機上執行。時區偏移量未包含在內。 

--getdate:返回包含計算機的日期和時間的 datetime2(7) 值,sql server 的例項正在該計算機上執行。時區偏移量未包含在內。 

--getutcdate:返回包含計算機的日期和時間的 datetime2(7) 值,sql server 的例項正在該計算機上執行。日期和時間作為 utc 時間(通用協調時間)返回。 

select current_timestamp as 'current_timestamp',getdate() as

'getdate',getutcdate() as 'getutcdate';

執行結果如下:

sqlserver 使用者定義表型別

有時需要將記憶體中的表與資料庫中的表比較,比如datatable中有100行資料,需要判斷在資料庫中是否存在,這個時候我們就可以使用sqlserver中的 使用者 定義表型別 這裡最最最重要的思路是把 使用者 定義表型別 當作一張虛擬的正常表去處理 需求 現在記憶體中有個datatable,資料庫中...

C 使用者定義型別轉換

c 使用者定義型別轉換 c 提供隱式轉換和顯式轉換 宣告隱式轉換的語法如下.注 所有使用者定義轉換必須使用public和static修飾符 public static implicit operator targettype sourcetype identifier targettype 目標型別...

django自定義使用者表

django中已經給我生成預設的user表,其中的字段已經可以滿足我們的日常需求。但有時候,我們需要更多的字段,我們就可以自定義。來替換django自帶的user表。models.py from django.contrib.auth.models import abstractuser class...