如何合并两个存储过程



我有两个存储过程,一个用于INSERT,第二个用于Update,我想将它们合并为一个,所以你能告诉我应该使用哪个语句吗?

CREATE PROCEDURE Tools
(@CategoryID_1 int,
 @CategoryName_2 nvarchar(100),
 @Description_3 ntext)
AS INSERT INTO Categories 
 (CategoryID,
 CategoryName,
 Description) 
VALUES 
(@CategoryID_1,
 @CategoryName_2,
 @Description_3)

CREATE PROCEDURE Tools1
     (@CategoryID_1     [int],
 @CategoryID_2  [int],
 @CategoryName_3    [nvarchar](50),
 @Description_4     [ntext],
AS UPDATE [Teachdb].[dbo].[Categories] 
SET  [CategoryID]    = @CategoryID_2,
 [CategoryName]  = @CategoryName_3,
 [Description]   = @Description_4,
WHERE 
( [CategoryID]   = @CategoryID_1)
go

这里可以通过传递@Mode value.

来合并两个存储过程代码
/*
For Insert 
exec Tools @Mode='Insert', @CategoryID='1', @CategoryName='DemoCat', @Description='demoDesc'
For Update
exec Tools @Mode='UPDATE', @CategoryID='1', @CategoryName='DemoCatupdate', @Description='demoDescupdate'
*/
CREATE PROCEDURE Tools
(
    @Mode nvarchar(100), -- Use for insert or Update
    @CategoryID int,
    @CategoryName nvarchar(100),
    @Description ntext
)
AS 
BEGIN 
    IF @Mode = 'INSERT'
    BEGIN
        INSERT INTO Categories (CategoryID, CategoryName, Description) 
        VALUES (@CategoryID, @CategoryName, @Description)
    END
    ELSE IF @Mode = 'UPDATE'
    BEGIN
        UPDATE [dbo].[Categories] 
            SET  [CategoryID]    = @CategoryID,
                [CategoryName]  = @CategoryName,
                [Description]   = @Description
        WHERE ([CategoryID]   = @CategoryID)
    END
END
go

如果无法更改存储过程的结构(通过添加额外的参数),则可以使用MERGE语句。

http://msdn.microsoft.com/en-us/library/bb510625 (v = sql.100) . aspx

有一点要注意,虽然我喜欢MERGE语句,但似乎有越来越多的bug被发现。我建议不要使用它,除非您了解自己在做什么(没有货物崇拜编程),并且已经检查了问题以查看是否包含您的场景。

相关内容

最新更新