I need to read and increment a value atomically in SQL Server 2008, using c#.
For example, I have to insert items of a \"lot\", for this i need the number of the last lo
The easiest way would be to just alter the table so that the lot number is an identity field and will auto-increment itself. Then you don't have to worry about incrementing in code.
Is it essential that the lot numbers be sequential? Why not just use an identity? This is better in terms of concurrency as otherwise you need to block concurrent insert attempts in case they get rolled back and would leave a gap in the sequence.
If it absolutely is a requirement however you can do
CREATE TABLE dbo.Sequence
(
OneRow CHAR(1) DEFAULT('X') PRIMARY KEY CHECK(OneRow = 'X'),
val INT
)
Insert a row with an initial seed.
INSERT INTO dbo.Sequence
(val)
VALUES (1)
Then to allocate a range of sufficient size for your insert (call it in the same transaction obviously)
CREATE PROC dbo.GetSequence
@val AS int OUTPUT,
@n as int =1
AS
UPDATE dbo.Sequence
SET @val = val = (val + @n);