2016-05-25 6 views
2

Я хочу дать уникальный идентификатор для каждого оператора вставки, который я делаю, поэтому я вижу, какие строки были вставлены вместе. Я предпочитаю, чтобы уникальный «идентификатор вставки» начинался с 1 и увеличивался на один, как IDENTITY(1,1) для строк.Как создать уникальный идентификатор для каждого оператора в SQL Server?

Есть ли простой способ, например, IDENTITY?

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

Какую бы разницу между колонкой 'ID' и' insertId'? – Lamak

+3

Почему бы не просто создать столбец DateCreated? Это будет столбец datetime, который не имеет значения NULL с по умолчанию GETDATE(). В противном случае вам придется пройти через много усилий, чтобы выполнить что-то подобное. Вам нужно будет использовать последовательность и, скорее всего, создать вместо триггера, чтобы вы могли управлять каждой вставкой. –

+0

В SQL Server ** 2012 ** и новее я бы использовал 'SEQUENCE' для выдачи уникальных порядковых номеров для каждой вставки. –

ответ

1

Это не решение, которое вы просили, но вы можете добавить столбец с отметкой времени по умолчанию, чтобы найти все строки, вставленные в то же самое время.

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

. Будет ли GETDATE() давать мне тот же DATETIME, если я вставляю 1.000.000 значений в одну вставку заявление? – Aabling

+0

@Aabling Я только что сделал небольшой тест и до тех пор, пока это одна и та же партия, да. –

0

Если вам нужно целое значение, то вы можете создать еще одну таблицу:

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

Тогда из вашего приложения, вставить строку в этом, а затем использовать сгенерированное значение личности (SCOPE_IDENTITY()).

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

Если вы используете этот подход, вы должны использовать SCOPE_IDENTITY() вместо @@ IDENTITY. http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/ –

+0

@SeanLange True, исправлено, спасибо чтобы указать на это. – Pred

1

Гиды удобны для подобных вещей.

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

Единственная проблема заключается в том, что это решение требует, чтобы вы добавили этот код в каждый отдельный оператор, который вставляется в эту таблицу. –

+0

@ArthurD Я действительно понимаю это, но я не верю, что OP сказал, что это неприемлемо. Если это невозможно, то другие ответы здесь могут быть полезными. – JosephStyons

0

Это то, что я сделал, спасибо за все предложения и комментарии.

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) 
Смежные вопросы