2016-05-25 9 views
2

私が作るすべての挿入ステートメントに一意のIDを与えたいので、これは一緒に挿入された行を確認することができます。一意の「挿入ID」が1から始まり、行数がIDENTITY(1,1)のように1ずつ増加することをお勧めします。SQL Serverのすべての挿入ステートメントに固有のIDを生成する方法はありますか?

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

uhm、あなたの 'ID'列と' insertedId'の違いは? – Lamak

+3

なぜ、単にDateCreatedカラムを持っていないのですか?これはデフォルトでGETDATE()でNOT NULLのdatetimeカラムになります。それ以外の場合は、このようなことを達成するために多くの努力を払わなければなりません。シーケンスを使用する必要があり、トリガの代わりに作成して、各インサートをマイクロ管理できます。 –

+0

SQL Server ** 2012 **以降では、各挿入に固有のシーケンス番号を渡すために 'SEQUENCE'を使用したいと思います。 –

答えて

1

これはあなたが尋ねたソリューションではありませんが、あなたは、同時に挿入されたすべての行を見つけるために、デフォルトのタイムスタンプを持つ列を追加することができます。

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

1.000.000の値を挿入すると、GETDATE()は同じDATETIMEを返しますか?ステートメント? – Aabling

+0

@Aabling私はちょっとしたテストをしましたが、同じバッチである限り、そうです。 –

0

あなたは整数値が必要な場合は、その後、あなたは別のテーブルを作成することができます。

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

次に、あなたのアプリから、このに行を挿入し、生成されたID値(SCOPE_IDENTITY())を使用します。

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

この方法を使用する場合は、@@ IDENTITYではなくSCOPE_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

GUIDはそのようなことのために便利です。

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) 
関連する問題