我知道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:
来自以下帖子: Post
提到SCOPE_IDENTITY()
通常是您想要使用的。
我的意思是'安全'是,在循环期间ID是否是唯一的?
谢谢。
答案 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