tri*_*bus 2 .net t-sql sql-server stored-procedures
从效率和最佳实践的角度来看,我欣赏每个人的想法.
我有一个存储过程,它生成(n)行的副本并将行插入必要的表.
例如.制作库存物料的副本并将副本添加到库存.
我看到这种类型的存储过程有两个选项.
选项1:
CREATE PROCEDURE CopyInventory
@InventoryID int
AS
BEGIN
INSERT INTO Inventory (fieldOne, fieldTwo, FieldThree)
(SELECT FieldOne, FieldTwo, FieldThree FROM Inventory WHERE InventoryID = @InventoryID)
END
Run Code Online (Sandbox Code Playgroud)
使用选项一,我将在客户端应用程序代码中的while循环内多次调用存储过程.
选项2:
CREATE PROCEDURE CopyInventory
@InventoryID int,
@CopyCount int
AS
BEGIN
DECLARE @counter int
SET @counter = 0
WHILE @counter < @CopyCount
INSERT INTO Inventory (fieldOne, fieldTwo, FieldThree)
(SELECT FieldOne, FieldTwo, FieldThree FROM Inventory WHERE InventoryID = @InventoryID)
END
END
Run Code Online (Sandbox Code Playgroud)
使用选项2,我将从客户端应用程序代码调用存储过程一次,并将复制计数作为参数传递.
选项二似乎是我的最佳选择,因为它只导致一个数据库调用.
我很感激你对为什么你喜欢一个而不是另一个或者没有任何最佳实践建议的想法.
当然可以在服务器端进行.
这将节省您在客户端和服务器之间的大量往返.
如果你基于循环设置会更好:
WITH hier(cnt) AS
(
SELECT 1 AS value
UNION ALL
SELECT cnt + 1
FROM hier
WHERE cnt < @count
)
INSERT
INTO Inventory (fieldOne, fieldTwo, FieldThree)
SELECT FieldOne, FieldTwo, FieldThree
FROM hier, Inventory
WHERE InventoryID = @InventoryID
Run Code Online (Sandbox Code Playgroud)