【发布时间】:2019-06-24 12:17:44
【问题描述】:
我将数据插入到两个表中。在每个插入中,都有一个到 #temp 表的 OUTPUT,每个表都有一个标识列。为插入生成数据的选择对于每个插入具有相同的顺序。稍后,我通过 Identity 列加入两个 #temp 表。我所期望的是,在插入时,标识列号将按照双方指定的顺序排列。每隔一段时间,这些数字似乎不匹配,我唯一能想到的是,在将 OUTPUT 数据写入临时表时,OUTPUT 可能并不总是遵守 select 语句中的顺序。
CREATE TABLE #TempTable
(
RowNumber Integer IDENTITY (1,1) NOT NULL,
TableID Integer
CONSTRAINT PK_TableID PRIMARY KEY NONCLUSTERED (RowNumber)
)
INSERT INTO Table
(column1,column2,column3,etc)
OUTPUT
INSERTED.ID
INTO #TempTable
(ID)
SELECT
column1,column2,column3,etc
FROM
Other table
ORDER BY
SourceFlag,
StoreID,
storenumber,
EstablishDate,
TableID
我希望这些语句会以相同的顺序从 1 到 25 在两个语句中插入例如 25 行。然后我应该能够根据行号 1 = 1、25= 25 等加入。为了得到匹配的数据。我认为正在发生的事情是顺序被弄乱了,所以第一个插入的第 1 行确实匹配第二个插入的第 14 行,所以当我后来加入 1 对 1 时,我得到的数据不匹配。
【问题讨论】:
-
您的情况有点不清楚,因为上面的
INSERT应该不起作用。#TempTable没有ID,而如果#TempTable有并且它是一个标识,则向其插入值将不起作用,除非您使用IDENTITY_INSERT,这似乎没有必要。您可以使用ROW_NUMBER() OVER (ORDER BY...)生成明确的顺序,而不是依赖于生成身份的任何顺序。 -
根据docs, "
INSERT查询使用SELECT和ORDER BY来填充行保证了标识值的计算方式但不是插入行的顺序”(强调我的)。请注意,这仅指插入到的表的标识,而不是OUTPUT子句中引用的任何表——您从INSERTED.ID返回的内容是确定性的,但作为@987654334 的结果生成的标识值@ 不会是。但是,根据我之前的评论,你不应该需要这些。
标签: sql sql-server output