我有一个更新两个表的存储过程。第一个表总是相同的表,但第二个表根据传入的参数而变化。将它全部写入一个大的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过程。
我认为后者更灵活,如果我想更新子表而不是主表?
答案 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语句更新表