在插入期间使用 IDENT_CURRENT() 获取我的 ID?

Eli*_*ias 0 sql sql-server insert

假设我有下表:

CREATE TABLE [ExampleTable]
(
    [ExampleID] [int] IDENTITY(1,1) NOT NULL,
    [ExampleCompositeNumber] [nvarchar](50) NULL,

    CONSTRAINT [PK_Certificates] 
        PRIMARY KEY CLUSTERED ([ExampleID] ASC)
) 
Run Code Online (Sandbox Code Playgroud)

我想要的是[ExampleCompositeNumber]成为ExampleID-[000000-999999]。

我希望这个插入能起作用,但我担心两个人同时插入,并且将错误的 ID 分配给第一部分ExampleCompositeNumber

INSERT INTO ExampleTable (ExampleCompositeNumber)
VALUES (CAST(IDENT_CURRENT('ExampleTable') AS nvarchar(18)) + '-123345')
Run Code Online (Sandbox Code Playgroud)

当我使用SCOPE_IDENTITY()而不是IDENT_CURRENT我得到以前插入的ID,而不是我当前正在制作的插入的ID。以下是该插入内容的示例:

INSERT INTO ExampleTable (ExampleCompositeNumber)
VALUES (CAST(SCOPE_IDENTITY() AS nvarchar(18)) + '-123345')
Run Code Online (Sandbox Code Playgroud)

我的担忧是否正确,或者如果发生多次插入,是否有可能重叠?

mar*_*c_s 8

一般来说,我建议使用SCOPE_IDENTITY()而不是其他任何东西(比如IDENT_CURRENT()获取新插入的身份值。请参阅此博客文章以获取有关原因的解释)

但在这种情况下,我相信最好的解决方案是使用:

  • 你的ExampleID INT IDENTITY(1,1)列让 SQL Server 处理您的数值的自动增量
  • 一个计算的、持久的列,用于将该数值转换为您需要的值

所以试试这个:

CREATE TABLE dbo.ExampleTable
(
    ExampleID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
    ExampleComposite AS 'ExampleID-' + 
                         RIGHT('000000' + CAST(ExampleID AS VARCHAR(6)), 6) + '-123345' PERSISTED,
   .... your other columns here....
)
  
Run Code Online (Sandbox Code Playgroud)

现在,每次插入一行ExampleTable而不指定ExampleID或 的值时ExampleComposite:

INSERT INTO dbo.ExampleTable(Col1, Col2, ..., ColN)
VALUES (Val1, Val2, ....., ValN)
Run Code Online (Sandbox Code Playgroud)

那么 SQL Server 就会增加你的ExampleID值,并且ExampleComposite会包含诸如ExampleID-000001-123345、ExampleID-000002-123345、...... 之类的值 - 自动、安全、可靠、无重复。