循环存储过程或客户端代码

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,我将从客户端应用程序代码调用存储过程一次,并将复制计数作为参数传递.

选项二似乎是我的最佳选择,因为它只导致一个数据库调用.

我很感激你对为什么你喜欢一个而不是另一个或者没有任何最佳实践建议的想法.

Qua*_*noi 8

当然可以在服务器端进行.

这将节省您在客户端和服务器之间的大量往返.

如果你基于循环设置会更好:

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)