Как вставить объемные данные без изменения порядка элементов в таблице с помощью оператора слияния
Я написал хранимую процедуру, которая может вставить объемные данные в таблицу, используя merge
заявление.
Проблема заключается в том, что когда я вставляю itemid 1024,1000,1012,1025 в этом порядке, SQL Server автоматически меняет порядок itemid 1000,1012,1024,1025.
Я хочу вставить данные, которые я на самом деле передаю.
Вот пример кода. Это проанализирует XML-строку в табличном объекте:
DECLARE @tblPurchase TABLE
(
Purchase_Detail_ID INT ,
Purchase_ID INT ,
Head_ID INT ,
Item_ID INT
);
INSERT INTO @tblPurchase (Purchase_Detail_ID, Purchase_ID, Head_ID, Item_ID)
SELECT
Tbl.Col.value('Purchase_Detail_ID[1]', 'INT') AS Purchase_Detail_ID,
Tbl.Col.value('Purchase_ID[1]', 'INT') AS Purchase_ID,
Tbl.Col.value('Head_ID[1]', 'INT') AS Head_ID,
Tbl.Col.value('Item_ID[1]', 'INT') AS Item_ID
FROM
@PurchaseDetailsXML.nodes('/documentelement/TRN_Purchase_Details') Tbl(Col)
Это вставит объемные данные в TRN_Purchase_Details
Таблица:
MERGE TRN_Purchase_Details MTD
USING (SELECT
Purchase_Detail_ID,
Id AS Purchase_ID,
Head_ID, Item_ID
FROM
@tblPurchase
LEFT JOIN
@ChangeResult ON 1 = 1) AS TMTD ON MTD.Purchase_Detail_ID = TMTD.Purchase_Detail_ID
AND MTD.Purchase_ID = TMTD.Purchase_ID
WHEN MATCHED THEN
UPDATE SET MTD.Head_ID = TMTD.Head_ID,
MTD.Item_ID = TMTD.Item_ID
WHEN NOT MATCHED BY TARGET THEN
INSERT (Purchase_ID, Head_ID, Item_ID)
VALUES (Purchase_ID, Head_ID, Item_ID)
WHEN NOT MATCHED BY SOURCE AND
MTD.Purchase_ID = (SELECT TOP 1 Id
FROM @ChangeResult
WHERE Id > 0) THEN
DELETE;
2 ответа
Строки в таблице SQL не имеют никакого порядка. Они возвращаются в неопределенном порядке, если вы не укажете order by
,
Попробуйте добавить столбец идентификаторов во временную таблицу?
DECLARE @tblPurchase TABLE
(
ID int identity,
Purchase_Detail_ID INT ,
Столбец идентификации может отражать порядок элементов XML.
Если это не сработает, вы можете рассчитать положение элементов в XML и сохранить эту позицию во временной таблице.
Как уже упоминалось, данные в таблице хранятся в виде неупорядоченного набора. Если вам нужно иметь возможность вернуться к своей таблице после вставки данных и определить порядок их добавления, вам потребуется добавить столбец в схему таблицы для записи этой информации.
Это может быть что-то простое, как добавление IDENTITY
столбец, который будет увеличиваться при каждом добавлении строки, или, возможно, столбец с DATETIME
тип данных и GETDATE()
значение по умолчанию, поэтому вы не только знаете, какие строки были добавлены, но и когда именно это произошло.