[鐵人賽][Denali 新特性探險10]Sequence

[鐵人賽][Denali 新特性探險10]Sequence

 

概述

Sequence類似 Identity Column ,差別在於 Sequence 不屬於Table Level 而是屬於 DataBase Level,

且Sequence也不參與交易。

 

管理

可以透過新的system catalog (sys.sequences) ,查看現在數值、累加數值、起始數值..等資訊。

select t1.name,t1.type,t1.type_desc,t1.is_cached,t1.cache_size,t1.current_value,
t1.minimum_value,t1.maximum_value
from sys.sequences t1

image

 

改善

以前SQL Server還沒有Sequence物件時,如果你想要很多資料表共用相同流水號,

大概都會在額外建立一個資料表來維護流水號,而每個AP的取號基本會有2步驟:

1.查詢該資料表最大編號。2.更新紀錄到該資料表並取號(以步驟1編號+1),

而這麼麻煩(參與交易)的處理過程是不會出現在 Denali 的,

因為 Denali多了 Sequence 新物件並解決共用相同流水號的問題,

而SQL Server Sequence 和Oracle Sequence 功能上並無差異。

 

操作示範

--建立MySerial Sequence
create sequence MySerial
start with 1
increment by 1
 
--建立 A 和B資料表
create table A
(
serial int,
name varchar(10)
)

	
create table B
(
serial int,
name varchar(10)
)

	
--新增資料。 A 和 B 資料表共用 MySerial
insert into A 
select next value for MySerial, 'rico' union all
select next value for MySerial, 'papa'

	
insert into B
select next value for MySerial, 'rico' union all
select next value for MySerial, 'papa'
--結果
select * from A
select * from B
image
next value=增加sequence的值。
 

Sequence0

alter sequence dbo.MySerial
restart with 0
--確認當前流水號
select t1.name,t1.current_value
from sys.sequences t1

image

 

不參與交易

select t1.name,t1.current_value as '交易前'
from sys.sequences t1
begin tran MYTRAN 
insert into a select next value for MySerial,'ricoisme'
rollback tran MYTRAN 
select t1.name,t1.current_value as '交易後'
from sys.sequences t1
--確認資料
select * from a

image

 雖然回復整個交易,但因為sequence 不參與交易,所以value + 1。 

 

  參考 Sequence Numbers