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によって独立しています。

4

1 に答える 1

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
于 2012-06-07T08:05:41.533 に答える