Sql server 如何合并两个存储过程

Sql server 如何合并两个存储过程,sql-server,sql-server-2008,stored-procedures,Sql Server,Sql Server 2008,Stored Procedures,我有两个存储过程,一个用于插入,另一个用于更新,我想将它们合并到一个存储过程中,您能告诉我应该使用哪个存储过程吗 CREATE PROCEDURE Tools (@CategoryID_1 int, @CategoryName_2 nvarchar(100), @Description_3 ntext) AS INSERT INTO Categories (CategoryID, CategoryName, Description) VALUES (@CategoryID_1

我有两个存储过程,一个用于插入,另一个用于更新,我想将它们合并到一个存储过程中,您能告诉我应该使用哪个存储过程吗

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)


转到这里,您可以通过传递@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语句


不过有一点值得注意——虽然我喜欢MERGE语句,但它似乎有一种被发现的感觉。我建议不要使用它,除非你了解你在做什么(没有cargo cult编程),并且已经检查了问题,看看你的场景是否包括在内

第二个过程似乎不完整:服务器:Msg 170,级别15,状态1,过程工具,第4行第4行:“@CategoryID”附近的语法不正确。服务器:Msg 137,级别15,状态1,过程工具,第11行必须声明变量'@Mode'。服务器:Msg 137,级别15,状态1,过程工具,第14行必须声明变量'@CategoryID'。服务器:Msg 137,级别15,状态1,过程工具,第16行必须声明变量'@Mode'。服务器:Msg 137,15级,状态1,过程工具,第19行必须声明变量“@CategoryID”。服务器:Msg 156,15级,状态1,过程工具,第22行关键字“WHERE”附近的语法不正确。如果你愿意,请提问。我很高兴,伙计,但上面说要投票,我需要15个声誉!
/*
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