存储过程以更新多个表

时间:2012-07-12 04:15:23

标签: sql sql-server stored-procedures

我有一个更新两个表的存储过程。第一个表总是相同的表,但第二个表根据传入的参数而变化。将它全部写入一个大的procudure是否更有效

CREATE PROCEDURE MyBigProc
    @id int
    @param int,
    @value1 int,
    @value2 int
AS
BEGIN
    SET NOCOUNT ON;

    -- First table to update
    UPDATE MyTable SET field1 = @value1 WHERE id = @id

    -- Then choose which table to update based on @param
    IF @param = 1
       UPDATE MySecondTable SET field2 = @value2 WHERE id = @id

    IF @param = 2
       UPDATE MyThirdTable SET field2 = @value2 WHERE id = @id
END

或者我应该为每个表编写一个单独的过程,然后从主过程中调用EXEC过程。

我认为后者更灵活,如果我想更新子表而不是主表?

4 个答案:

答案 0 :(得分:1)

  

我认为后者更灵活,如果我想更新一个   子表但没有主表?

确切地说,你有充分的理由将工作分成两个独立的过程。如果对其他一切都有意义,我不明白为什么不遵循这种方法。

不这样做的一个可能原因是,如果您需要同时更新成功或失败。在这种情况下,我会将所有内容都保留在一个proc中,并将所有内容都包含在一个事务中。

答案 1 :(得分:0)

最好有不同的存储过程,然后在一个地方调用它们。在执行维护活动时,它会对您有所帮助。

答案 2 :(得分:0)

CREATE PROCEDURE MyBigProc 
    @id int,
    @param int,
    @value1 int,
    @value2 int
AS
BEGIN
    SET NOCOUNT ON;

    -- First table to update
    UPDATE MyTable SET field1 = @value1 WHERE id = @id;

    -- Then choose which table to update based on @param
    IF @param = 1     
        exec SP_MySecondTable @id,@value2;
    IF @param = 2
       exec SP_MyThirdTable @id,@value2;
END

CREATE PROCEDURE SP_MySecondTable
    @id int, 
    @value2 int
AS
BEGIN  
    UPDATE MySecondTable SET field2 = @value2 WHERE id = @id;
END

CREATE PROCEDURE SP_MyThirdTable
    @id int, 
    @value2 int
AS
BEGIN  
  UPDATE MyThirdTable SET field2 = @value2 WHERE id = @id;
END

答案 3 :(得分:0)

最好的选择是使用CASE语句更新表