在插入语句中使用OUTPUT时,如果您在select中指定顺序,是否遵循select中指定的顺序?

时间:2019-06-24 12:17:44

标签: sql sql-server output

我正在将数据插入两个表中。在每个插入中,都有一个到#temp表的输出,每个输出都有一个标识列。为每个插入生成数据的选择的顺序相同。稍后,我通过“标识”列连接两个#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的方式加入时,会得到不匹配的数据。

1 个答案:

答案 0 :(得分:2)

显然,it doesn't

  

但是,SQL Server不保证行的顺序   使用OUTPUT子句由DML语句处理并返回。

您需要在数据中标识一个自然键,然后对其进行引用以将新插入的行与OUTPUT结果集进行匹配。

或者,您可以将INSERT替换为MERGE;在这种情况下,您将能够在identity子句中为记录创建新创建的OUTPUT值。