0

我有两个存储过程,一个用于 INSERT,第二个用于更新,我想将它们合并为一个,所以您能告诉我应该使用哪个状态吗?

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

4

2 回答 2

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
于 2013-04-01T08:14:23.660 回答
0

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

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

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

于 2013-04-01T09:25:42.743 回答