SQL Server设置多个变量

时间:2011-10-28 10:04:13

标签: sql sql-server-2005 tsql

我有7个不同的存储过程,它们接受许多参数并将数据插入7个不同的表中。

我现在正在创建一个主存储过程来执行这7个过程及其所需的所有数据。他们需要的所有数据都是ONE表(CommonImport)。

我应该在这个主存储过程中获取所需的所有参数吗?

或者

只接收需要插入这7个单独表中的行的ID,并直接从表中获取数据。

我认为第二种选择是最好的。但是,如何将主存储过程中的所有变量设置为(CommonImport)表中的所有数据?

基本上,如何将一堆声明的变量设置为CommonImport表中特定行的值?

由于

2 个答案:

答案 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的包装器,所以你要做的就是在进程中封装一个步骤(从表中获取数据)。

它还允许您在数据收集部分周围放置一个事务,并从表中删除数据。或许多其他选择。它很灵活,我喜欢灵活。