【问题标题】:stored procedure with insert & update using identity column使用标识列插入和更新的存储过程
【发布时间】:2013-02-13 06:08:23
【问题描述】:

我有一个名为“tasks”的表,其中'task id' 是标识列,对于该表,我必须编写保存存储过程,当没有给出“任务 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 TaskId=@TaskId)
    BEGIN
        INSERT TblTasks
        VALUES (@ProjectId,@EmployeeId,@TaskName,@Duration_Hrs,
                @StartDate,@FinishDate,@CreateUserId,@CreatedDate,
                @ModifiedUserID,@ModifiedDate,@Is_CommonTask)
    END
    ELSE
    BEGIN
        UPDATE TblTasks SET 
        StartDate=@StartDate,FinishDate=@FinishDate,
        Duration_Hrs=@Duration_Hrs 
        WHERE TaskId=@TaskId
    END
END
GO

【问题讨论】:

  • 您的问题是什么?如果它只是测试 @TaskID 变量,我建议将 IF 语句更改为 IF @TaskID = -1 (或其他一些将用作“未给定”用户案例的值的值。如果你想知道什么是插入后的任务id,然后使用@@IDENTITY。如果你还想返回@TaskID,则将参数设为OUTPUT

标签: sql sql-server sql-server-2008


【解决方案1】:

首先,给你的输入变量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 
        StartDate=@StartDate,FinishDate=@FinishDate,
        Duration_Hrs=@Duration_Hrs 
        WHERE TaskId=@TaskId
    END


END
GO

【讨论】:

    【解决方案2】:

    你已经关闭,检查记录是否不存在并执行插入,否则更新。您还可以将@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 TaskId=@TaskId
        END
    END
    GO
    

    【讨论】:

      【解决方案3】:

      将@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 
              StartDate=@StartDate,FinishDate=@FinishDate,
              Duration_Hrs=@Duration_Hrs 
              WHERE TaskId=@taskid
          END
      END
      GO
      

      【讨论】:

        【解决方案4】:

        在这种情况下,我曾经创建一个能够插入、更新和删除项目的通用存储过程。一般模式是这样的

        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 中拥有所有操作代码(当然我可以使用三个),还可以在其中添加日志功能和其他基本逻辑这个程序。

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

        【讨论】:

          猜你喜欢
          • 2021-07-07
          • 1970-01-01
          • 1970-01-01
          • 2014-06-23
          • 1970-01-01
          • 1970-01-01
          • 2022-07-30
          • 1970-01-01
          • 2017-12-02
          相关资源
          最近更新 更多