2012-06-07 33 views
1

我的表結構如下:是否有可能是主要的列值獨立於每個模式劃分

CREATE TABLE [ACC].[Document](
    [DocumentID] [int] IDENTITY(1,1) NOT NULL, 
    [Date] [date] NOT NULL, 
    [SalesCompanyFinancialPeriodID] [int] NOT NULL, 
    [DocumentTypeID] [int] NULL, 
CONSTRAINT [PK_Document] PRIMARY KEY CLUSTERED 
(
    [DocumentID] ASC 
) 

我想分區上SalesCompanyFinancialPeriodID列我的桌子。是否有可能在每個分區上重置DocumentID列值。換言之,每個分區中的DocumentID獨立於其他分區中的DocumentID。

+0

不,如果它將保留爲'IDENTITY()',則不行。你爲什麼要這樣做? –

+0

會計人員在每個財務期單獨歸檔其文件。並且想要從每個財務期開始的參考編號爲1. –

+0

表 –

回答

1

根據您的具體標準,如果只需要在飛行中的參考號,你可以創建一個視圖:

CREATE VIEW Acc.PartitionedDocument 
AS 
    SELECT DocumentID, 
      Date, 
      SalesCompanyFinancialPeriod, 
      DocumentTypeID, 
      ROW_NUMBER() OVER(PARTITION BY SalesCompanyFinancialPeriod ORDER BY DocumentID) [PartitionDocumentID] 
    FROM Acc.Document 

但是,如果文件被刪除,這將發生改變。否則,就我所知,使用SQL-Server 2008的唯一選擇是使用觸發器或在應用程序層中維護一個序列。以下是我如何用觸發器實現這一點。

-- ADD ADDITIONAL COLUMN 
ALTER TABLE Acc.Document ADD ParitionDocumentID INT NULL 
GO 
-- UPDATE EXISTING ROWS 
;WITH Doc AS 
( SELECT *, ROW_NUMBER() OVER(PARTITION BY SalesCompanyFinancialPeriod ORDER BY DocumentID) [RowNumber] 
    FROM Acc.Document 
) 
UPDATE Doc 
SET  PartitionDocumentID = RowNumber 

GO 
-- ADD CONSTRAINT TO ENSURE NO DUPLICATES 
ALTER TABLE Acc.Document ADD CONSTRAINT UQ_Acc_Document UNIQUE NONCLUSTERED (PartitionDocumentID, SalesCompanyFinancialPeriodID) 
GO 
-- ADD TRIGGER TO MAINTAIN NEW COLUMN 
CREATE TRIGGER acc.InsertDocument 
ON Acc.Document 
FOR INSERT 
AS 
    IF EXISTS(SELECT 1 FROM inserted WHERE PartitionDocumentID IS NULL) 
     BEGIN 

      UPDATE Acc.Document 
      SET  PartitionDocumentID = COALESCE(NextDocumentID, 0) + RowNumber 
      FROM Acc.Document d 
        INNER JOIN 
        ( SELECT DocumentID, ROW_NUMBER() OVER(PARTITION BY SalesCompanyFinancialPeriodID ORDER BY DocumentID) [RowNumber] 
         FROM inserted 
         WHERE PartitionDocumentID IS NULL 
        ) i 
         ON i.DocumentID = d.DocumentID 
        LEFT JOIN 
        ( SELECT SalesCompanyFinancialPeriodID, MAX(PartitionDocumentID) [NextDocumentID] 
         FROM Acc.Document 
         GROUP BY SalesCompanyFinancialPeriodID 
        ) NextID 
         ON NextID.SalesCompanyFinancialPeriodID = d.SalesCompanyFinancialPeriodID 
     END 
+0

的每個部分上都有獨立編號的最佳做法非常感謝 –

相關問題