2013-02-13 130 views
2

我有一个名为'tasks'的表,其中'task id'是identity列,对于那个表我必须写保存存储过程,其中当'task id'没有给出时它应该插入值,当给出'任务ID'时,它应该更新表。使用标识列插入和更新的存储过程

当任务ID是标识列时,这怎么能实现任何人都可以用例子来解释。 这里是代码

Alter PROCEDURE TaskSave 
(
@taskid int, 
@ProjectId int, 
@EmployeeId int, 
@TaskName nvarchar(50), 
@Duration_Hrs int, 
@StartDate nvarchar(20), 
@FinishDate nvarchar(20), 
@CreateUserId int, 
@CreatedDate nvarchar(20), 
@ModifiedUserID int, 
@ModifiedDate nvarchar(20), 
@Is_CommonTask bit 
) AS 

BEGIN 
    IF Exists(select null from TblTasks where [email protected]) 
    BEGIN 
     INSERT TblTasks 
     VALUES (@ProjectId,@EmployeeId,@TaskName,@Duration_Hrs, 
       @StartDate,@FinishDate,@CreateUserId,@CreatedDate, 
       @ModifiedUserID,@ModifiedDate,@Is_CommonTask) 
    END 
    ELSE 
    BEGIN 
     UPDATE TblTasks SET 
     [email protected],[email protected], 
     [email protected]_Hrs 
     WHERE [email protected] 
    END 
END 
GO 
+0

你的问题是什么?如果它只是测试'@ TaskID'变量,我建议将IF语句改为'IF @TaskID = -1'(或其他一些值,它将用作“未给定”用户的值。你想在插入后知道什么是任务ID,然后使用'@@ IDENTITY'。如果你还想返回'@ TaskID',使参数OUTPUT – cha 2013-02-13 06:21:19

回答

0

首先,让你的输入变量的TaskID像下面的默认值,然后简单地检查是否变量是NULL,如果是,插入一个新行

Alter PROCEDURE TaskSave 
(
@taskid int = NULL, 
@ProjectId int, 
@EmployeeId int, 
@TaskName nvarchar(50), 
@Duration_Hrs int, 
@StartDate nvarchar(20), 
@FinishDate nvarchar(20), 
@CreateUserId int, 
@CreatedDate nvarchar(20), 
@ModifiedUserID int, 
@ModifiedDate nvarchar(20), 
@Is_CommonTask bit 
) AS 

BEGIN 

    IF @taskid IS NULL 
    BEGIN 
     INSERT TblTasks 
     VALUES (@ProjectId,@EmployeeId,@TaskName,@Duration_Hrs, 
       @StartDate,@FinishDate,@CreateUserId,@CreatedDate, 
       @ModifiedUserID,@ModifiedDate,@Is_CommonTask) 
    END 
    ELSE 
    BEGIN 
     UPDATE TblTasks SET 
     [email protected],[email protected], 
     [email protected]_Hrs 
     WHERE [email protected] 
    END 


END 
GO 
0

你靠近,检查记录不存在,并执行插入,否则更新。您也可以声明@TaskId参数作为OUTPUT和插入时返回它,使用SCOPE_IDENTITY()功能:

ALTER PROCEDURE TaskSave(
    @TaskId INT = NULL OUTPUT 
    , @ProjectId INT 
    , @EmployeeId INT 
    , @TaskName NVARCHAR(50) 
    , @Duration_Hrs INT 
    , @StartDate NVARCHAR(20) 
    , @FinishDate NVARCHAR(20) 
    , @CreateUserId INT 
    , @CreatedDate NVARCHAR(20) 
    , @ModifiedUserID INT 
    , @ModifiedDate NVARCHAR(20) 
    , @Is_CommonTask BIT 
) 
AS 
BEGIN 

    IF NOT(EXISTS(SELECT * FROM TblTasks WHERE TaskId = @TaskId)) 
    BEGIN 
     INSERT INTO TblTasks(
      ProjectId 
      , EmployeeId 
      , TaskName 
      , Duration_Hrs 
      , StartDate 
      , FinishDate 
      , CreateUserId 
      , CreatedDate 
      , ModifiedUserID 
      , ModifiedDate 
      , Is_CommonTask 
     ) 
     VALUES(
      @ProjectId 
      , @EmployeeId 
      , @TaskName 
      , @Duration_Hrs 
      , @StartDate 
      , @FinishDate 
      , @CreateUserId 
      , @CreatedDate 
      , @ModifiedUserID 
      , @ModifiedDate 
      , @Is_CommonTask 
     ) 
     SET @TaskId = SCOPE_IDENTITY() 
    END 
    ELSE 
    BEGIN 
     UPDATE TblTasks SET 
      StartDate = @StartDate 
      , FinishDate = @FinishDate 
      , Duration_Hrs = @Duration_Hrs 
     WHERE [email protected] 
    END 
END 
GO 
0

声明@taskid参数为NULL。如果它为null,则插入其他更新。见下文。

Alter PROCEDURE TaskSave 
(
@taskid int =NULL, 
@ProjectId int, 
@EmployeeId int, 
@TaskName nvarchar(50), 
@Duration_Hrs int, 
@StartDate nvarchar(20), 
@FinishDate nvarchar(20), 
@CreateUserId int, 
@CreatedDate nvarchar(20), 
@ModifiedUserID int, 
@ModifiedDate nvarchar(20), 
@Is_CommonTask bit 
) AS 

BEGIN 
    if @taskid is null 
    BEGIN 
     INSERT TblTasks 
     VALUES (@ProjectId,@EmployeeId,@TaskName,@Duration_Hrs, 
       @StartDate,@FinishDate,@CreateUserId,@CreatedDate, 
       @ModifiedUserID,@ModifiedDate,@Is_CommonTask) 
    END 
    ELSE 
    BEGIN 
     UPDATE TblTasks SET 
     [email protected],[email protected], 
     [email protected]_Hrs 
     WHERE [email protected] 
    END 
END 
GO 
0

在这些情况下,我用来创建一个能够插入,更新和删除项目的通用存储过程。一般模式看起来像这样

create procedure Modify_MyTable 
    @Action char(1), 
    @Data int, 
    @PK int output 
as 
    if @Action = 'I' begin -- Insert 
    insert into MyTable (Data) values (@Data) 
    set @PK = Scope_Identity() 
    end 
    if @Action = 'M' begin -- Modify 
    update MyTable set Data = @Data where PKID = @PK 
    end 
    if @Action = 'D' begin -- Delete 
    delete MyTable where PKID = @PK 
    end 

这是相当长一段时间前,当我用这个,但我发现我有一个SP所有的操作代码(我可以使用了三个,当然),它很方便,也可以在此过程中添加日志记录功能和其他基本逻辑。

我不是说这仍然是最好的方法,但它应该显示基本逻辑。