2

我有一个更新两个表的存储过程。第一个表始终是同一个表,但是第二个表会根据传入的参数而变化。将其全部写入一个大过程中是否更有效,这样

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

4 回答 4

1

我想后者更灵活,比如如果我想更新子表但不更新主表?

确切地说,您有充分的理由将工作拆分为 2 个单独的 proc。如果这对你来说其他一切都有意义,我不明白为什么不遵循这种方法。

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

于 2012-07-12T04:21:18.050 回答
1
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
于 2012-07-12T04:31:50.540 回答
0

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

于 2012-07-12T04:25:18.090 回答
0

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

于 2019-02-27T08:11:57.693 回答