【发布时间】:2018-12-24 09:22:51
【问题描述】:
我编写了一个存储过程,可以使用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;
【问题讨论】:
-
关系表根据定义是一个无序的数据集 - 你不能除了/保留任何“排序”插入后。 ONLY 获取排序的方法是,当您从该表运行
SELECT并明确指定ORDER BY子句时。其他任何事情都只是巧合的“排序”-不可靠,不可重现-只是巧合
标签: sql sql-server sql-merge