2012-08-28 93 views
0

使用SQL Server 2008的值改變R2我想有一個表(已經對2列的主鍵)與第三列是基於所述兩列中的一個自動增量主鍵的一部分。SQL Server的自動遞增另一場

在其它方面,我想添加新記錄到表時,具有自動增量文件AIfield如下自動遞增:

PK1 PK2 AIfield 
    ------------------ 
    1 A  1 
    1 B  2 
    1 C  3 
    2 A  1 
    2 B1 2 
    2 B2 3 
    2 C1 4 

其中PK1和PK2是主要的兩個場鍵。

我不想使用明顯的MAX(Afield)+1方法,因爲很可能我必須爲同一個PK1執行併發插入操作 - 遲早會在相同的PK1中爲AIfield創建重複項。

有什麼建議嗎?

+1

要大家:這個問題是不是得到一個選擇具有一個唯一的編號,這是併發性安全更新表的一個值的列。所以所有的答案只是一個SELECT ROW_NUMBER()不是回答問題 – eddo

回答

0

那麼,這種方法可以創建在PK1和AIfield

CREATE UNIQUE NONCLUSTERED INDEX [test] ON [Table] 
(
[AIfield] ASC, 
[PK1] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, 
IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, 
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

唯一索引和處理違規行爲的唯一

DECLARE @inserted BIT=0 
DECLARE @AIfield BIGINT 
SELECT @AIfield=MAX(AIfield)+1 FROM Table WHERE [email protected] 
WHILE @inserted=0 
BEGIN 
BEGIN TRY 
    INSERT INTO Table(AIfield,PK1,PK2) 
    SELECT @AIfield,@PK1,@PK2 
    SET @inserted=1 
END TRY 
BEGIN CATCH 
    IF ERROR_NUMBER()=2601 
    BEGIN 
    SET @[email protected]+1 
    END 
    ELSE SET @inserted=1 
END CATCH 
END 

我不知道是否有一種方法更SQL本地雖然

1
select pk1,pk2,ROW_NUMBER() over (partition by pk1,pk2 order by (select 0)) as AIfield 
from yourtable 
+0

這是要併發插入安全嗎? – eddo

+0

你能給我多一點細節嗎? – AnandPhadke

+0

你可以做的是,把上面的查詢結果爲表變量或臨時表,然後做任何你需要 – AnandPhadke

0

使用下面的查詢:

Select PK1, PK2, ROW_NUMBER() over (partition by PK1 order by PK1, PK2) as AIfield 
From yourtable