如何为SQL Server中的每个插入语句生成唯一ID?

时间:2016-05-25 14:23:49

标签: sql-server

我想为每个插入语句提供一个唯一的ID,这样我就可以看到哪些行一起插入了。我更喜欢独特的"插入ID"从1开始,像行IDENTITY(1,1)一样增加1。

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)   

4 个答案:

答案 0 :(得分:1)

这不是您要求的解决方案,但您可以添加一个带有默认时间戳的列来查找同时插入的所有行。

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

答案 1 :(得分:1)

Guids对于类似的东西很方便。

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)

答案 2 :(得分:0)

如果需要整数值,则可以创建另一个表:

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

然后从您的应用中插入一行,然后使用生成的标识值(SCOPE_IDENTITY())。

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

答案 3 :(得分: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)