0

假設我在數據庫中有一個Projects表來追蹤活動項目,以及一個Tasks表,該表追蹤每個ProjectTasks。每個表都有一個正常的自動生成主鍵,但是我也希望每個任務的TaskNumber相對於Project。因此,當Tasks被添加到Project時,它們被分配從001,002,003等遞增的數字,從001開始爲每個項目。如何設置SQL Server來生成分組索引?

首先,我想我可以存儲一個NextTaskNumber字段,每個Project。但是,在任何有機會添加新任務並增加NextTaskNumber字段之前,多人可能會從數據庫請求相同的號碼。我不想以Project中的重複任務號碼結束。


更新

感謝您的答案,到目前爲止,但我忘了提一個臨界點。我實際上是通過NHibernate訪問數據庫,而不是直接通過SQL命令。那麼有沒有辦法通過N Hibernate映射來做到這一點?或者,也可以在創建新任務時在數據庫上設置觸發器以填充任務號字段?

回答

0

您可以使用NextTaskNumber想法如果你有控制足夠的過代碼,以便您可以強制是否插入到工作表中的一塊使用包括NextTaskNumber的讀數交易的創作任務行,然後更新NextTaskNumber。該事務應鎖定數據,以便不會有重複的TaskNumber條目。

+0

實際上,現在我想起了它..你可以在Task表上使用INSERT觸發器來做到這一點,該表也使用與上面的類似的事務來更新被插入的數據,同時更新NextTaskNumber 。我沒有做過這樣的事情,但它可能會奏效。 – roberttdev 2011-04-22 23:59:28

0

下面的代碼是受了我一貫的 「我剛睡醒」 負債:

單插入

INSERT INTO Tasks 
      (ProjectID,Name,GroupedIndexField) 
SELECT @ProjectID 
     , 'Do Some Work' 
     , (SELECT ISNULL(MAX(GroupedIndexField), 0) 
      FROM Tasks 
      WHERE ProjectID = @ProjectID) + 1 

多次插入

INSERT INTO Tasks 
      (ProjectID,Name,GroupedIndexField) 
SELECT tblTasksToInsert.ProjectID 
     , tblTasksToInsert.Name 
     , (SELECT ISNULL(MAX(GroupedIndexField), 0) 
      FROM Tasks 
      WHERE ProjectID = tblTasksToInsert.ProjectID) + ROW_NUMBER() OVER (PARTITION BY tblTasksToInsert.ProjectID ORDER BY InsertionOrder) 
    FROM tblTasksToInsert 

創建視圖

創建帶有以下查詢的視圖:

SELECT TaskID 
     , ProjectID 
     , ROW_NUMBER() OVER (PARTITION BY ProjectID ORDER BY TaskID) AS GroupedIndexValue 
    FROM Tasks 

的SQL Server Denali車型

的SQL Server Denali車型允許您創建序列。每個項目可以有多個序列,但這不是真正的使用它們的正確方法。