【问题标题】:How to update a table using stored procedures in SQL Server如何使用 SQL Server 中的存储过程更新表
【发布时间】:2014-02-24 18:08:20
【问题描述】:

我在 SQL Server 中创建了一个名为“Employee”的表,现在我想使用存储过程更新该表。

该表有emp_nameemp_codestatus 列。假设该表有 3 条记录:最初,在存储过程中,我想使用 select 语句获取最后两条记录,我必须将获取的记录'status'设置为'Y'。

我写了一个存储过程,但它不影响原始表。请建议对存储过程的查询。

这是我的查询:

create  procedure updtdemployee As
  select e.Emp_name ,e.Circle 
  from employee e 
  where e.Emp_Code ='2501' or e.Emp_Code='2502'

  begin
    update employee set status='Y' where Emp_name = employee.Emp_name
  end

【问题讨论】:

  • 您可以在UPDATE 中执行WHERE

标签: sql sql-server stored-procedures


【解决方案1】:

您不需要选择部分,只需进行更新即可。

CREATE PROCEDURE updtdemployee
       @employeeID INT
  AS
    BEGIN
     UPDATE employee 
     SET status='Y' 
     WHERE Emp_Code = @employeeID
    END

如果你想做静态你可以使用这个

CREATE PROCEDURE updtdemployee     
      AS
        BEGIN
         UPDATE employee 
         SET status='Y' 
         WHERE Emp_Code = 2501 or Emp_Code = 2502
        END

【讨论】:

  • 但我需要使用 emp 代码从表中获取两条记录,然后我必须更改相应的记录。有可能吗
  • 我为您放置了模板,现在我为您的案例更新了我的答案,但如果您总是有两个值,您可以添加另一个变量并使用它
【解决方案2】:

根据您的问题“我想获取最后两条记录”,如果这只会影响最后两条记录,

CREATE PROCEDURE updtdemployee     
      AS
        BEGIN
         UPDATE employee 
         SET status='Y' 
         WHERE Emp_Code in (select top 2 Emp_Code from employee order by Emp_Code desc)
        END

我纯粹是在猜测您想订购的方式,但这是您要找的吗?

【讨论】:

  • 例如我说但我想从表中获取任意两行,我必须将状态更改为“Y”
  • 是的,这个位将做到这一点,在这种情况下总是返回最后 2 条记录。您现在可能想更改它,因为我将其更改为 code CREATE PROCEDURE updtdemployee AS BEGIN UPDATE employee SET status='Y' WHERE Emp_Code in (select top 2 Emp_Code from employee where status'Y'按 Emp_Code desc 排序)END code 这样它就不会一直尝试更新它已经修改过的记录?
  • 否则如果你只是想在emp_codes中修改code CREATE PROCEDURE updtdemployee @empcode1 int, @empcode2 int AS BEGIN UPDATE employee SET status='Y' WHERE Emp_Code = @empcode1 or Emp_Code = @empcode2 END code
【解决方案3】:
-- =============================================
-- Author:      XYZ
-- Create date: xx-xx-xxxx
-- Description: Procedure for Updating  Emp Detail
-- =============================================


CREATE PROCEDURE [dbo].[SP_EmpLoyee_Update]
(
@EmpCode bigint=null,
@EmpName nvarchar(250)=null,
@MNumber nvarchar(250)=null,
@Status int=null,
@LoginUserId nvarchar(50)=null,
@Msg nvarchar(MAX)=null OUTPUT
)
AS
BEGIN TRY

UPDATE tbl_Employees
SET
EmpName=@EmpName,
MNumber=@MNumber,
Status=@Status,
ModificationDate=GETDATE()

WHERE EmpCode=@EmpCode

    SET @Msg='Employee   Updated Successfully.'

END TRY
BEGIN CATCH

    SET @Msg=ERROR_MESSAGE()

END CATCH

GO

【讨论】:

    【解决方案4】:

    *试试下面的代码

    Create Procedure UpdateRecord (@emp_code int)
    as
    begin 
    update employee set status= 'Y'
     where emp_code=@emp_code
    end
    

    *如下执行

    exec UpdateRecode 3
    

    3 是您的 emp_code。请根据您的要求进行更改。

    【讨论】:

      【解决方案5】:
      drop procedure if exists updateBillerContactInfo1;
      DELIMITER $$
      CREATE PROCEDURE updateBillerContactInfo1 (INOUT account_id_list varchar(4000))
      BEGIN
          DECLARE finished INTEGER DEFAULT 0;
          DECLARE first_name varchar(255) DEFAULT "";
          DECLARE last_name varchar(255) DEFAULT "";
          DECLARE db_id int(10) DEFAULT 0;
      
      -- declare cursor
      DEClARE curContact 
          CURSOR FOR 
          select contact.first_name, contact.last_name, acc.db_id from 
          ...(table and conditions)limit 100;
      
      DECLARE CONTINUE HANDLER 
          FOR NOT FOUND SET finished = 1;
      
      OPEN curContact;
      
      updateContact: LOOP
          FETCH curContact INTO first_name, last_name, db_id;
          IF finished = 1 THEN 
              LEAVE updateContact;
          END IF;
          -- to update in stored procedure, use stored statement, do not use UPDATE WHERE directly, it cause issue
          SET @updateText = CONCAT('UPDATE iam_capability.t_account 
              SET first_name = ?, last_name = ? 
              WHERE db_id = ?;');
          PREPARE stmt1 FROM @updateText;
          SET @fn = first_name;
          SET @ln = last_name;
          SET @id = db_id;
          EXECUTE stmt1 USING @fn, @ln, @id;
          DEALLOCATE PREPARE stmt1;
          -- build update account id list
          SET account_id_list = CONCAT(db_id, ",",account_id_list);
      END LOOP updateContact;
      CLOSE curContact;
      
      END$$
      DELIMITER ;
      
      -- use transaction to run the script 
      start transaction;
      SET @account_id_list = ""; 
      CALL updateBillerContactInfo1(@account_id_list); 
      SELECT @account_id_list;
      
      -- check if data get updated as expected, yes run commit, no, run Rolback
      
      commit;
      
      ROLLBACK;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多