2016-08-01 14 views
-1

ich einige einzigartige sequentielle Zähler in tbl1 Tabelle erstellt werden soll, also schrieb ich folgenden Code:generieren eindeutige fortlaufende Nummern SQL in Multi-User-Umgebung mit

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(); 
} 

aber manchmal sind die erzeugten Zähler Duplikat sind (weil mehrere Benutzer führe den Code aus, gibt es irgendeinen Mechanismus, den ich einzigartige sequentielle Zähler erzeuge?

+0

http://stackoverflow.com/ Fragen/18598535/Vermeidung-Concurrent-Insert-mehrere-same-ID-in-Mysql – Rumpelstinsk

+0

Sie können auch einen eindeutigen Index für die Spalte – Rumpelstinsk

+0

@Rumpelstinsk: Ich möchte einen Mechanismus verwenden, die immer einen richtigen Zähler generieren. – Masoud

Antwort

1

Sie können versuchen, FOLGE zu verwenden wie dieses

Source:

Schritt 1:

In diesem Schritt müssen wir eine Beispieltabelle und eine Sequenz erstellen, um demonstrieren es.

-- 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 

Schritt 2:

In diesem Schritt müssen wir einen Standardwert für die [ID] Spalte die obige Tabelle, und der Standardwert der [ID] Spalte sollte erstellen Geben Sie SEQUENCE ein und fügen Sie ein benutzerdefiniertes Skript hinzu, um Varchar zu erstellen.

Unten ist das Skript angegeben.

-- 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 

Schritt 3:

Lets Einsatz wenige Datensätze in die Tabelle.

-- 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 

Schritt 4:

Sobald die Daten eingefügt wurde, können Sie die Tabelle durchsuchen und die [ID] Spaltendaten anzeigen, die es entweder eine Zahl oder varchar nur ist.

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

Es ist erwähnenswert, dass die Sequenz in 2012 Version eingeführt wurde, so dass es nicht auf älteren Versionen funktioniert. –

+1

Es ist auch bemerkenswert, dass Lücken in den zugewiesenen Sequenzwerten vorhanden sein können. –

+0

Aber ich benutze SQL Server 2008 – Masoud

0

In SQL Server 2008 gibt es keine sequence Objekt, sondern, dass Sie bedeutet nicht, nicht ein nachahmen kann, einschließlich aller Optionen eines Sequenzobjekt, mit Ausnahme kassiert. Sie müssen jedoch berücksichtigen, dass es Lücken in der Sequenz (d. H. 1, 2, 5, 6, 8 ...)

, das zu tun, Sie starten, indem Sie eine Tabelle mit einer einzigen Spalte erstellen, wird das als identity angegeben:

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

Dann eine gespeicherte Prozedur erstellen, die Ihnen die nächste Nummer erhalten:

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

alles was Sie jetzt tun müssen, um die nächste Zahl zu erhalten, ist einfach die gespeicherte Prozedur ausführen:

DECLARE @NextNumber int 
EXEC stp_NextSequenceNumber @NextNumber output 

Es ist auch möglich, weiter, dieses Verfahren zu entwickeln Recycling der Sequenz zu handhaben truncate table verwenden, die alle Werte aus der Tabelle gelöscht werden und die Identität Spalte zurückgesetzt, um es Saatgut ist:

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