我有7个不同的存储过程,它们接受许多参数并将数据插入7个不同的表中。
我现在正在创建一个主存储过程来执行这7个过程及其所需的所有数据。他们需要的所有数据都是ONE表(CommonImport)。
我应该在这个主存储过程中获取所需的所有参数吗?
或者
只接收需要插入这7个单独表中的行的ID,并直接从表中获取数据。
我认为第二种选择是最好的。但是,如何将主存储过程中的所有变量设置为(CommonImport)表中的所有数据?
基本上,如何将一堆声明的变量设置为CommonImport表中特定行的值?
由于
答案 0 :(得分:2)
我建议接受所有变量作为参数并为它们定义默认值,因此SP用户既可以使用单个ID参数,也可以使用另一个作为weel直接指定
CREATE PROCEDURE MainSP
@ID int,
@CustomParameter varchar(10) = NULL,
@CustomParameter1 DateTime = NULL,
...
这样SP就会非常灵活
答案 1 :(得分:2)
传递ID:
这样做的好处是可以简化存储过程的所有接口。
这使得编码更容易。如果你最终从几个地方调用SP,你只需要使用一个参数,而不是加载和传递几个参数。
传递n
变量
然后在这里受益的是你将你的存储过程与保留表分开。
这意味着您可以直接调用存储过程,而无需在表中包含任何数据。如果数据以新的方式到达,或者用于单元测试等,这在将来可能会有用。
哪个最好:
我不认为对此有直接的答案,更多的是偏好和意见。
我的观点是,耦合程度越低,越好。面对变化,它更灵活。
我这样做的方式如下......
CREATE PROCEDURE main_by_variable @v1 INT, @v2 INT, ...
BEGIN
EXEC sub_part_1 @v1, @v3
EXEC sub_part_2 @v2
EXEC sub_part_3 @v2, @v3
...
END
CREATE PROCEDURE main_by_id @id INT AS
BEGIN
DECLARE
@v1 INT,
@v2 INT,
...
SELECT
@v1 = field1,
@v2 = field2
FROM
holding_table
WHERE
id = @id
EXEC main_by_variable @v1, @v2, ...
END
GO;
通过main_by_variable
过程,您可以获得灵活性,例如测试所有子过程,而无需将任何数据输入到保留表中。而且这种灵活性也是子程序的一部分。
但是,为方便起见,您可能会发现使用main_by_id
更加整洁。因为这只是main_by_variable的包装器,所以你要做的就是在进程中封装一个步骤(从表中获取数据)。
它还允许您在数据收集部分周围放置一个事务,并从表中删除数据。或许多其他选择。它很灵活,我喜欢灵活。