2016-08-01 40 views
-1

我想生成tbl1表中的一些獨特的順序計數器唯一的序列號,所以我寫了下面的代碼:生成在多用戶環境中使用SQL

using (var dbConnection = CommonDA.GetDbConnection()) 
{ 
    var command = dbConnection.CreateCommand(); 
    dbConnection.Open(); 
    command.CommandText = "insert into tbl1(Counter) select Max(Counter)+1 from tbl1;"; 
    command.ExecuteNonQuery(); 
} 

但有時產生計數器是重複的(因爲多個用戶運行代碼),是否有任何機制可以生成唯一的順序計數器?

+0

http://stackoverflow.com/問題/ 18598535/avoid-concurrent-insert-multiple-same-id-in-mysql – Rumpelstinsk

+0

你也可以在列上定義一個唯一的索引 – Rumpelstinsk

+0

@Rumpelstinsk:我想使用一種總是生成正確計數器的機制。 – Masoud

回答

1

你可以嘗試使用SEQUENCE這樣

Source

第1步:

在這一步中,我們需要創建一個示例表,並 表現出序列它。

-- This script is compatibile with SQL Server 2012 and above. 
-- CREATE TABLE 
USE tempdb 
GO 
CREATE TABLE dbo.tbl_sample 
([ID] VARCHAR(8) , 
    [Name] varchar(50) 
CONSTRAINT PK_Employee_EmployeeID 
PRIMARY KEY CLUSTERED ([ID] ASC)) 
GO 

--CREATE SEQUENCE 
USE tempdb 
GO 
CREATE SEQUENCE dbo.Sample_Seq AS 
INT START WITH 1 
INCREMENT BY 1 ; 
GO 

步驟2:

在此步驟中,我們需要爲 的[ID]列中的上述表中創建一個默認值,[ID]列的默認值應是 SEQUENCE並添加一個自定義腳本以使其成爲varchar。

下面給出的是腳本。

-- This script is compatibile with SQL Server 2012 and above. 
-- CREATE DEFAULT VALUE OF SEQUENCE 
USE tempdb 
GO 
ALTER TABLE dbo.tbl_sample 
ADD CONSTRAINT Const_Sample_Seq 
DEFAULT FORMAT((NEXT VALUE FOR dbo.Sample_Seq),'CUS0000#') FOR [ID]; 
GO 

第3步:

允許插入幾條記錄到表中。

-- This script is compatibile with SQL Server 2012 and above. 
-- Insert records into the table 
USE tempdb 
GO 
INSERT INTO dbo.tbl_sample ([Name]) 
VALUES ('Imran'),('Bob'),('Sandra') 
GO 

步驟4:

一旦數據已被插入,就可以瀏覽表並查看 [ID]列中的數據,這是唯一的一個數字或VARCHAR。

--Browse Table 
USE tempdb 
GO 
SELECT * FROM tbl_sample 
GO 
--OUTPUT 
+1

值得強調的是2012年版本中引入了序列的事實,所以它不適用於舊版本。 –

+1

值得注意的是,在指定的序列值中可能存在空位。 –

+0

但是,我正在使用sql server 2008 – Masoud

0

在SQL Server 2008中沒有sequence對象,但是,這並不意味着你不能模仿一個,包括一個序列對象的所有選項,除了兌現。 但是,您必須考慮到序列中可能存在空白(即1,2,5,6,8 ...)的事實)

要做到這一點,您可以通過與單個列創建表開始,被指定爲identity

CREATE TABLE tblSequence 
(
    Number int identity(1, 1) 
) 

然後,創建一個存儲過程,將讓你的下一個數字:

CREATE PROCEDURE stp_NextSequenceNumber 
(
    @NextNumber int output 
) 
AS 
BEGIN 
    INSERT INTO tblSequence DEFAULT VALUES 
    SELECT @NextNumber = SCOPE_IDENTITY() 
END 
GO 

現在你需要做的就是下一個數字就是簡單地執行存儲過程:

DECLARE @NextNumber int 
EXEC stp_NextSequenceNumber @NextNumber output 

也有可能進一步發展這一過程來處理使用truncate table序列的回收,將從表中刪除所有值,並重新標識列到它的種子:

CREATE PROCEDURE stp_NextSequenceNumber 
(
    @NextNumber int output 
) 
AS 
BEGIN 

    DECLARE @CurrentNumber int 
    SELECT @CurrentNumber = MAX(Number) 
    FROM tblSequence 

    IF @CurrentNumber >= 10 -- In this example, 10 is the max value of the sequence 
     TRUNCATE TABLE tblSequence 

    INSERT INTO tblSequence DEFAULT VALUES 
    SELECT @NextNumber = SCOPE_IDENTITY() 

END 
GO