最后一个插入ID唯一的最安全的方法 - SQL

时间:2016-09-30 10:47:03

标签: sql-server

我知道SCOPE_IDENTITY()将从insert语句中获取最后一行。但是,对于以下情况,我不太确定SCOPE_IDENTITY()是否安全。由于SELECT MAX(ID) FROM TableA将通过扫描表格来获取最大ID,因此我会相信它会出现性能问题。

情况如下:

DECLARE @DaysInMonth INT
DECLARE @FirstID    INT
DECLARE @SecondID   INT
DECLARE @ThirdID    INT
DECLARE @FourthID   INT

SET @DaysInMonth = DAY(EOMONTH('2016-09-01'))

    BEGIN TRY
        BEGIN TRANSACTION
            WHILE @DaysInMonth > 0
                BEGIN
                    -- First Insert -- Begin
                    INSERT INTO tableA ('first insert - ' + @DaysInMonth)
                    -- First Insert -- End

                    SET @FirstID = SCOPE_IDENTITY()

                    -- Second Insert -- Begin
                    INSERT INTO tableB ('second insert - ' + @DaysInMonth)
                    -- Second Insert -- End

                    SET @SecondID = SCOPE_IDENTITY()

                    -- Third Insert -- Begin
                    INSERT INTO tableC ('third insert - ' + @DaysInMonth)
                    -- Third Insert -- End

                    SET @ThirdID = SCOPE_IDENTITY()

                    -- Fourth Insert -- Begin
                    INSERT INTO tableD ('fourth insert - ' + @DaysInMonth)
                    -- Fourth Insert -- End

                    SET @FourthID = SCOPE_IDENTITY()

                    SET @DaysInMonth = @DaysInMonth - 1
                END
        COMMIT TRANSACTION
    END TRY

    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION

        THROW
    END CATCH

从上面的情况来看,我必须在每个循环中插入记录第四次,以表示我声明的月份中的天数。

据我所知,有4个获取最后插入的ID:

  1. SCOPE_IDENTITY
  2. @@ IDENTITY
  3. SELECT MAX(ID)FROM tableA
  4. IDENT_CURRENT
  5. 来自以下帖子: Post

    提到SCOPE_IDENTITY()通常是您想要使用的。

    我的意思是'安全'是,在循环期间ID是否是唯一的?

    谢谢。

1 个答案:

答案 0 :(得分:2)

你可以在最后一个insert语句中使用OUTPUT列,Ofcourse这是另一个选项,你将得到什么输入语句正确执行..下面只是一个例子

CREATE TABLE #tablea (
  id int IDENTITY (1, 1),
  val char(10)
)

DECLARE @outputtbl TABLE (
  id int,
  val char(10)
)

INSERT INTO #tablea (val)
OUTPUT INSERTED.* INTO @outputtbl
  VALUES ('test')

SELECT id
FROM @outputtbl