При использовании OUTPUT в операторе вставки, если вы указываете порядок с помощью выбора, удовлетворяет ли он порядку, указанному в операторе выбора? - PullRequest
1 голос
/ 24 июня 2019

Я вставляю данные в две таблицы.В каждой вставке есть ВЫХОД к таблице #temp, каждая со столбцом идентификаторов.Выбор, генерирующий данные для вставки, имеет одинаковый порядок для каждой вставки.Позже я соединяю две таблицы #temp по столбцу Identity.Я ожидал бы, что номера столбцов идентификаторов будут выстроены в порядке, указанном с обеих сторон при вставке.Время от времени кажется, что эти числа не совпадают, и единственное, о чем я могу думать, это то, что, возможно, OUTPUT не всегда соблюдает порядок в выражениях select при записи данных OUTPUT во временные таблицы.

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

Я ожидал бы, что операторы будут вставлять, например, 25 строк в оба оператора в одном и том же порядке от 1 до 25. Тогда я смогу объединиться на основе номера строки 1 = 1,25 = 25 и т. Д., Чтобы получить соответствующие данные.То, что я думаю, происходит из-за того, что порядок нарушается, так что строка # 1 из первой вставки действительно совпадает, скажем, со строкой № 14 со второй, поэтому, когда я позже присоединяюсь 1 к 1, я получаю несоответствующие данные.

1 Ответ

2 голосов
/ 24 июня 2019

Очевидно, это не :

Однако SQL Server не гарантирует порядок, в котором строки обрабатываются и возвращаются операторами DML с использованием предложения OUTPUT.

Вам необходимо идентифицировать естественный ключ в ваших данных и затем ссылаться на него, чтобы сопоставить вновь вставленные строки с набором результатов OUTPUT.

В качестве альтернативы, вы можете заменить INSERTс MERGE;в этом случае вы сможете перехватывать вновь созданные значения identity для своих записей в предложении OUTPUT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...