根據您的具體標準,如果只需要在飛行中的參考號,你可以創建一個視圖:
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
不,如果它將保留爲'IDENTITY()',則不行。你爲什麼要這樣做? –
會計人員在每個財務期單獨歸檔其文件。並且想要從每個財務期開始的參考編號爲1. –
表 –