2016-05-25 7 views
2

Ich möchte eine eindeutige ID für jede Insert-Anweisung, die ich mache, geben, damit ich sehen kann, welche Zeilen zusammen eingefügt wurde. Ich bevorzuge, dass die eindeutige "Einfüge-ID" bei 1 beginnt und um eins wie die IDENTITY(1,1) für Reihen zunimmt.Wie generiert man eine eindeutige ID für jede Insert-Anweisung in SQL Server?

Gibt es einen einfachen Weg wie IDENTITY, das zu tun? Diese

CREATE TABLE [dbo].[factTrade] 
(
     [ID] [int] IDENTITY(1,1) NOT NULL, 
     [insertedID] [int] NOT NULL, 
     [quantity] [int] NOT NULL, 
     [price] [decimal](20, 10) NOT NULL 
) 

INSERT INTO [dbo].[factTrade] ([insertedID], [quantity], [price]) 
VALUES (1, 6, 2.5), (1, 4, 3.7), (1, 3, 4.1), (1, 7, 8.5), 

INSERT INTO [dbo].[factTrade] ([insertedID], [quantity], [price]) 
VALUES (2, 5, 5.2), (2, 1, 4.6) 
+0

ähm, was wäre der Unterschied zwischen Ihrer 'ID' Spalte und' insertedId'? – Lamak

+3

Warum haben Sie nicht nur eine DateCreated-Spalte? Es wäre eine Datetime-Spalte, die NOT NULL mit dem Standardwert von GETDATE() ist. Sonst müßte man sehr viel anstrengen, um so etwas zu erreichen. Sie müssten eine Sequenz verwenden und wahrscheinlich einen Trigger anstelle eines Triggers erstellen, damit Sie jede Einfügung mikroverwalten können. –

+0

In SQL Server ** 2012 ** und neuer würde ich eine "SEQUENCE" verwenden, um eindeutige Sequenznummern für jeden Insert auszugeben. –

Antwort

1

ist nicht die Lösung, die Sie gefragt, aber man konnte eine Spalte mit einem Standard-Zeitstempel hinzufügen alle Zeilen gleichzeitig eingefügt zu finden.

ALTER TABLE dbo.factTrade 
ADD InsertDate DATETIME NOT NULL DEFAULT (GETDATE()) 
+1

Gibt mir das GETDATE() die gleiche DATETIME, wenn ich 1.000.000 Werte in eine Einfügung einfüge Erklärung? – Aabling

+0

@Aabling Ich habe gerade einen kleinen Test gemacht und solange es die gleiche Charge ist, ja. –

0

Wenn Sie einen Integer-Wert benötigen, dann können Sie eine weitere Tabelle erstellen:

CREATE TABLE inserts ([ID] INT IDENTITY(1,1)...) 

Dann aus der App, legen Sie eine Zeile in diese, dann verwenden Sie den generierten Identitätswert (SCOPE_IDENTITY()).

INSERT inserts DEFAULT VALUES; 
SELECT @insertId = SCOPE_IDENTITY(); 
+1

Wenn Sie diesen Ansatz verwenden, sollten Sie SCOPE_IDENTITY() anstelle von @@ IDENTITY verwenden. http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vsident_current-retrieve-last-inserted-identity-of-record/ –

+0

@SeanLange Wahr, fest, danke um es aufzuzeigen. – Pred

1

Guids sind praktisch für solche Dinge.

declare @insertid uniqueidentifier = newid(); 
CREATE TABLE [dbo].[factTrade](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [insertedID] [int] NOT NULL, 
    [quantity] [int] NOT NULL, 
    [price] [decimal](20, 10) NOT NULL, 
    [insertid] [uniqueidentifier] not null 
) 

INSERT INTO [dbo].[factTrade] 
    ([insertedID] 
    ,[quantity] 
    ,[price] 
    ,[insertid] 
) 
VALUES 
    (1, 6, 2.5,@insertid), 
    (1, 4, 3.7,@insertid), 
    (1, 3, 4.1,@insertid), 
    (1, 7, 8.5,@insertid) 
set @insertid = newid(); --get another guid 
INSERT INTO [dbo].[factTrade] 
    ([insertedID] 
    ,[quantity] 
    ,[price] 
    ,[insertid] 
) 
VALUES 
    (2, 5, 5.2,@insertid), 
    (2, 1, 4.6,@insertid) 
+1

Das einzige Problem ist, dass diese Lösung erfordert, dass Sie diesen Code jeder einzelnen Anweisung hinzufügen, die in diese Tabelle eingefügt wird. –

+0

@ArthurD Ich verstehe das, aber ich glaube nicht, dass das OP gesagt hat, dass das inakzeptabel sei. Wenn dies nicht möglich ist, können die anderen Antworten hier hilfreich sein. – JosephStyons

0

Dies ist, was ich getan habe, danke für alle Vorschläge und Kommentare.

DECLARE @insertedID INT 

CREATE TABLE [dbo].[factTrade] 
(
     [ID] [int] IDENTITY(1,1) NOT NULL, 
     [insertedID] [int] NOT NULL, 
     [quantity] [int] NOT NULL, 
     [price] [decimal](20, 10) NOT NULL 
) 

CREATE SEQUENCE [dbo].[factTradeInsertedID] AS INT 
    START WITH 1 
    INCREMENT BY 1 

SET @insertedID = NEXT VALUE FOR [dbo].[factTradeInsertedID] --1 

INSERT INTO [dbo].[factTrade] 
      ([insertedID] 
      ,[quantity] 
      ,[price]) 
    VALUES 
      (@insertedID, 6, 2.5) 
      ,(@insertedID, 4, 3.7) 
      ,(@insertedID, 3, 4.1) 
      ,(@insertedID, 7, 8.5) 


SET @insertedID = NEXT VALUE FOR [dbo].[factTradeInsertedID] --2 

INSERT INTO [dbo].[factTrade] 
      ([insertedID] 
      ,[quantity] 
      ,[price]) 
    VALUES 
      (@insertedID, 5, 5.2) 
      ,(@insertedID, 1, 4.6) 
Verwandte Themen