我有一个TVP类型List_Of_Items,并且想要一次插入多行,所以我的选择是将存储过程与TVP参数一起使用,如下所示。这样的插入安全吗,我可以摆脱交易了吗?还是它的潜在危险,因为插入内容可能会在中间破裂,因此必须进行交易吗?
CREATE PROC Insert_Order_With_Details
(
@Items List_Of_Items
)
AS
BEGIN
BEGIN TRANSACTION
INSERT INTO OrderDetails (OrderId, CustomerId, ItemId, Quantity)
SELECT @OrderID, @CustomerID, ItemID, Quantity
FROM @Items
COMMIT
END
答案 0 :(得分:1)
否,仅当您有多个要作为原子操作运行的SQL语句时,才应使用显式事务。
单个SQL语句在隐式事务中运行,因此任何单个语句都可以成功完成或完全失败-您将永远不会有insert...select
在select操作中间失败并且只插入部分语句的情况。行。