2011-09-13 43 views
1

我需要使用c#在SQL Server 2008中原子地讀取和增加一個值。在SQL Server中讀取和增加int值

例如,我必須插入「lot」的項目,爲此我需要最後一批的編號並確保沒有其他人獲得此編號。

所以我只有最後一個批號的表,並找到一種方法來獲取和更新數字只有一步。

我該怎麼做?

+2

是至關重要的是,批號是連續的?爲什麼不使用「身份證」? –

+0

也許古怪的更新方法在這裏http://stackoverflow.com/questions/7184410/sql-server-update-mytable-set-col1-value-col2-col1或這裏http://stackoverflow.com/questions/6653962/ ms-sql-query-update-record-retrieve-via-stored-procedure可以提供幫助。 –

回答

0

最簡單的方法是隻更改表格,以便批號是identity字段,並自動自增。那麼你不必擔心代碼中的增量。

2

批號是連續的嗎?爲什麼不使用identity?這在併發性方面更好,否則你需要阻止併發插入嘗試,以防它們回滾並在序列中留下空隙。

如果絕對是必需的,但是你可以做

CREATE TABLE dbo.Sequence 
    (
    OneRow CHAR(1) DEFAULT('X') PRIMARY KEY CHECK(OneRow = 'X'), 
    val INT 
) 

插入一行與初始種子。

INSERT INTO dbo.Sequence 
      (val) 
VALUES  (1) 

然後分配範圍足夠大的尺寸爲您的插入(調用它顯然是同一個事務)

CREATE PROC dbo.GetSequence 
@val AS int OUTPUT, 
@n as int =1 
AS 
UPDATE dbo.Sequence 
SET @val = val = (val + @n); 
+1

請謹慎對待這種「古怪的更新」語法。我在上面的第一個鏈接問題的評論導致更多的信息.​​.. –

+0

@Aaron - 這是記錄爲一行AFAIK工作。 –

+0

記錄在哪裏?並持續到什麼版本?我不是說這是一個糟糕的解決方案,它只是沒有通過我的面向未來的測試。 –