2017-01-17 54 views
0

我有一個包含4列ID,c1,c2和LOT的表格。 ID是主鍵。對於c1爲5時的每條記錄,我想自動生成一個LOT的數字,對於每個不同的c2值,它將是從1開始的序列。MSSQL只能在某些情況下自動增加列數

所以如果c1不是5,則LOT保持爲空。但是,如果c1爲5則,其中C2 = 1我想填充LOT從1 防爆開始自動遞增序列中的每個記錄:

ID c1 c2 LOT 
1 3 
2 5 1 1 
3 5 1 2 
4 5 1 3 
5 4 

然後做同樣爲C2的不同價值。所以,如果C2是2,有從1開始自動遞增批號的另一個一堆:

ID c1 c2 LOT 
6 3 
7 5 2 1 
8 5 1 4 
9 5 2 2 
10 5 2 3 

我們使用MSSQL 2014企業版。表分區會很有用,還是需要爲C2的每個不同值創建特殊表?

+0

對不起,我沒有看到該鏈接中的觸發器的引用。 – user1693404

+1

對不起,我以前發佈了錯誤的鏈接。請參閱http://stackoverflow.com/q/24335341/1072229進行類似的討論。 –

+0

謝謝。這看起來相關。我也發現這一點:側邊欄,也尋址http://stackoverflow.com/questions/2205036/sql-server-unique-auto-increment-column-in-the-context-of-another-column?rq=1這使用一個觸發器,解釋我的關注下面(關於唯一性) – user1693404

回答

0

謝謝大家對使用觸發器的建議(所有投票)。事實證明(正如我在上面的評論中提到的),在側欄上出現的文章(SQL Server unique auto-increment column in the context of another column)顯示了適當的INSTEAD OF INSERT觸發器的詳細構造。作者提到它是「未測試」,並且確實存在一個輕微的錯誤(在WITH子句中缺少GROUP BY ParentEntityID),但任何人複製代碼都會得到一個明顯需要修復的錯誤。可能不會在這裏糾正這個帖子,但另一個問題是6歲。

1

不帶有標識字段,您可以改爲使用觸發器。

1

使用標識功能無法做到這一點,但是,請考慮使用Instead of trigger手動管理所需的值。

+0

我想我沒有看到如何保證觸發器可以產生獨特的不間斷序列。你如何解決多個同時插入的問題? – user1693404

+0

我不知道如何解決同時插入的問題,但我不認爲真的有什麼辦法可以保證不使用引擎的身份 –

+0

實際上,在帖子中我提到了「我自己的」回答如下,觸發器代碼使用SET TRANSACTION ISOLATION LEVEL SERIALIZABLE,作者說這保證了一個不間斷的獨特序列(但有一些潛在的性能問題)。 – user1693404

0

你可以使用邏輯在查詢或視圖來生成LOT:考慮到與(ID,C1,C2)中產生的表

SELECT ID, C1, C2, 
    CASE 
     WHEN C1<>5 OR C2 IS NULL THEN NULL 
     ELSE COUNT(*) OVER (PARTITION BY C1, C2 ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 
    END AS LOT 
FROM D 
ORDER BY ID 

CREATE TABLE D (ID INT PRIMARY KEY IDENTITY, C1 INT, C2 INT) 
INSERT D VALUES (3,NULL), 
       (5,1), 
       (5,1), 
       (5,1), 
       (4,NULL), 
       (3,NULL), 
       (5,2), 
       (5,1), 
       (5,2), 
       (5,2) 

查詢產生輸出上面所指出的:

ID C1 C2 LOT 
1 3 
2 5 1 1 
3 5 1 2 
4 5 1 3 
5 4 
6 3 
7 5 2 1 
8 5 1 4 
9 5 2 2 
10 5 2 3 

用於產生LOTCOUNT(*) OVER (PARTITION BY C1, C2 ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW的聲明,只需計算在當前行(包括C1和C2等於當前行)之前的行數。例如,對於第4行,元組(c1,c2)=(5,1)在包含該行(第2,3和4行)之前的3條記錄中被觀察到,所以LOT = 3。

相關問題