如何合并两个存储过程

时间:2013-04-01 07:14:20

标签: sql-server sql-server-2008 stored-procedures

我有两个存储过程,一个用于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

GO

2 个答案:

答案 0 :(得分:1)

在这里,你可以通过传递@Mode值来合并两个存储过程代码。

/*
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

答案 1 :(得分:0)

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

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

但需要注意的是 - 虽然我喜欢MERGE声明,但似乎找到了increasing number of bugs。我建议不要使用它,除非你了解你正在做什么(没有货物崇拜编程),并审查了问题,看看你的方案是否包括在内。