我有两个存储过程,一个用于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
答案 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。我建议不要使用它,除非你了解你正在做什么(没有货物崇拜编程),并审查了问题,看看你的方案是否包括在内。