2010-07-09 73 views
1

是否可以創建每月身份? 基本上是我需要的是sql每月身份

create table 
(
id identity primary key 
regDate DateTime not null, 
regDateNumber int not null 
) 

,當我插入數據,我需要設置regDateNumber作爲regDate的一個月

的這樣的範圍身份:

id regDate regDateNumber 
1 1 jan 2008 1 
2 3 jan 2008 2 
3 7 jan 2008 3 
4 1 feb 2008 1 
5 1 feb 2008 2 
6 1 aug 2008 1 
7 1 aug 2008 2 
8 1 sep 2008 1 
9 1 sep 2008 2 

回答

1

我相信你可以通過使用存儲過程實現這一點:

CREATE PROCEDURE month_indentity 
    @myInput DateTime 
AS 
SELECT COUNT(*) + 1 FROM mytable 
WHERE MONTH(regDate) = MONTH(@myInput) 
    AND YEAR(regDate) = YEAR(@myInput) 
GO 
+0

這是我如何計算插入SP內的值,我相信這需要一些表鎖定?如果在同一時間有2次調用此sp,是否會發生這種情況,我是否可以得到2條記錄具有相同的值regDateNumber – Omu 2010-07-09 08:09:16

+0

我不認爲這將在繁忙的服務器環境中正常工作 - 您最終會爲你的「month_identity」重複值,因爲你在這裏並沒有真正考慮併發...... – 2010-07-09 08:09:57

2

你不能這樣做它與身份,所以你可以計算飛行。 喜歡的東西:

select id, regDate, 
row_number() over(partition by year(regDate), month(regDate) as regDateNumber order by id) 
from t 
+0

實際上我不需要在選擇時動態分區,我需要計算何時插入 – Omu 2010-07-09 07:52:44

+2

您可以嘗試使用觸發器來做到這一點。我不建議這樣做,因爲它非常容易出錯。 可能如果你描述如何使用這個領域,我們會找到更好的解決方案 – burnall 2010-07-09 08:01:20

2

你可以計算列只需添加到您的表:

ALTER TABLE dbo.YourTable 
    ADD regMonth AS MONTH(regDate) PERSISTED 

,並用它做。這將被計算,持續(例如,在每次訪問時不重新計算,但僅在regDate發生變化時),包含日期的MONTH信息,甚至可以爲速度編制索引。

更新:好的,現在我明白了 - 你的「每月身份」有點不明確和誤導。你想要的是每個月的順序編號,對吧?

這樣做的一種方法是不做它/不存儲它,但使用burnall的方法與ROW_NUMBER()函數。

否則,你必須做一個AFTER INSERT觸發器,它計算出INSERT的新值 - 但這樣做會很麻煩,而且b)當你做大量插入操作時,會花費你相當多的性能。

我的建議是使用burnall的功能,讓它運行每隔一小時左右更新一次這些字段。不要試圖通過INSERT在飛行中解決這個問題 - 你的表現會很糟糕。

+0

當我插入時,這將如何幫助我生成regDateNumber? – Omu 2010-07-09 07:54:39

+0

但我需要一個每月的身份,不只是一個月 – Omu 2010-07-09 07:56:21

+0

我需要在插入時設置它,因爲如果有人會刪除一些記錄,我應該得到一個列表或記錄像1,2,5,6而不是1,2,3 ,4(你的情況) – Omu 2010-07-09 08:05:35

1
create table #table (iid int identity (1, 1), dy int, mth varchar(3)) 

insert into #table (dy, mth) 
select 1, 'jan' union all 
select 2, 'jan' union all 
select 20, 'jan' union all 
select 10, 'jan' union all 
select 1, 'feb' union all 
select 3, 'feb' union all 
select 28, 'feb' 

select T.dy, T.mth, 
    (select count(X.iid) from #table X where X.mth = T.mth and X.iid < T.iid) + 1 as month_rank 
from #table T 
order by T.mth, month_rank 

我不會存儲值作爲計算的領域,因爲它可以隨時間而改變,它違反了規範化規則。