【问题标题】:How to update multiple rows of a table through a stored procedure?如何通过存储过程更新表的多行?
【发布时间】:2020-01-21 10:55:03
【问题描述】:

Take this image of the table as the table on which I need to perform the multiple update operations 我有一个包含 1000 个条目的员工表,另一个表是包含 1000 个条目的部门表。我创建了一个映射表,其中包含两个表的主键,它也有 1000 个条目。现在,我必须连接所有这三个表并对某些行执行更新过程,但它应该能够一次性更新行,这也是使用存储过程的首选。需要帮助!

我知道使用 table 变量这样做, 但我需要了解如何编写脚本来创建存储过程并执行相同操作。

谢谢。

【问题讨论】:

  • 请粘贴您尝试过的代码示例
  • 我不知道如何继续,我读了很多但不太明白。
  • 从粘贴输入数据结构和所需输出开始。
  • UPDATE 接受 FROM 子句和公用表表达式 (WITH x AS (SELECT value, newvalue FROM Table) UPDATE x SET value = newvalue),它们允许您使用 JOINs、子查询以及您需要同时更新集合中所有行的任何其他内容方式。它不仅限于更新单行。同样,如果您现在使用实际的表、实际数据和实际查询,人们实际上可以建议如何重写您所拥有的。
  • 你是一名实习生——去问问应该教你和指导你的人。为了将来参考,您可能已经在互联网上的某个地方讨论过任何问题。学习搜索。如果您无法通过搜索找到任何内容,请尝试文档。 MS 有很多示例的相当好的文档 - update statement。如果您不知道如何编写存储过程,那么在开始此任务之前似乎需要额外的培训。

标签: sql sql-server database join inner-join


【解决方案1】:

正如许多人在 cmets 中所建议的那样,您绝对应该阅读UPDATE 在 SQL Server 中的工作原理,因为它可以满足您的所有需求。

无论如何,这里有一个示例可以帮助您解释这一点。首先,让我们创建一个表 Employees 并用一些记录填充它:

create table Employees
(
    id int,
    first_name varchar(50),
    last_name varchar(50),
    starting_date date,
    last_checked date
)

insert into Employees values 
(1, 'John', 'Smith', '2016-05-16', null),
(2, 'Sandra', 'Evans', '2013-02-02', null),
(3, 'Phil', 'Jones', '2019-10-25', null),
(4, 'Jenny', 'Lewis', '2018-07-11', null),
(5, 'Steve', 'Daniels', '2018-02-28', null)

现在我们可以选择该表中的所有行并查看数据:

select * from Employees

RESULTS:
/------------------------------------------------------------\
| id | first_name | last_name | starting_date | last_checked |
|----|------------|-----------|---------------|--------------|
| 1  | John       | Smith     | 2016-05-16    | NULL         |
| 2  | Sandra     | Evans     | 2013-02-02    | NULL         |
| 3  | Phil       | Jones     | 2019-10-25    | NULL         |
| 4  | Jenny      | Lewis     | 2018-07-11    | NULL         |
| 5  | Steve      | Daniels   | 2018-02-28    | NULL         |
\------------------------------------------------------------/

现在,如果我们想要更新表中的每一行,例如在last_checked 列中设置一个值,这可以通过一个简单的UPDATE 语句来完成:

update Employees set last_checked = getdate()

这会更新表中的每条记录:

select * from Employees

RESULTS:
/------------------------------------------------------------\
| id | first_name | last_name | starting_date | last_checked |
|----|------------|-----------|---------------|--------------|
| 1  | John       | Smith     | 2016-05-16    | 2020-01-21   |
| 2  | Sandra     | Evans     | 2013-02-02    | 2020-01-21   |
| 3  | Phil       | Jones     | 2019-10-25    | 2020-01-21   |
| 4  | Jenny      | Lewis     | 2018-07-11    | 2020-01-21   |
| 5  | Steve      | Daniels   | 2018-02-28    | 2020-01-21   |
\------------------------------------------------------------/

如果需要,您同样可以使用WHERE 子句来确定应该更新哪些记录:

update Employees set last_checked = '2019-01-01' where starting_date <= '2019-01-01'

select * from Employees

RESULTS:
/------------------------------------------------------------\
| id | first_name | last_name | starting_date | last_checked |
|----|------------|-----------|---------------|--------------|
| 1  | John       | Smith     | 2016-05-16    | 2019-01-01   |
| 2  | Sandra     | Evans     | 2013-02-02    | 2019-01-01   |
| 3  | Phil       | Jones     | 2019-10-25    | 2020-01-21   |
| 4  | Jenny      | Lewis     | 2018-07-11    | 2019-01-01   |
| 5  | Steve      | Daniels   | 2018-02-28    | 2019-01-01   |
\------------------------------------------------------------/

请注意每个last_checked 日期(除了菲尔琼斯的日期)是如何更新的,因为update 语句中的where starting_date &lt;= 2019-01-01 子句。

希望这能演示 update 语句的基础知识,如果需要,当然可以将其包装在存储过程中:

create procedure [dbo].[updateEmployeeLastChecked] 
    @newDate date = null
as

if @newDate is null set @newDate = getdate()
update Employees set last_checked = @newDate where starting_date <= @newDate

因此,在这种情况下,存储过程采用一个可选参数(如果未提供,则默认为当前日期)指定更新Employees 表中的记录时要使用的日期,前提是指定的日期在starting_date 为每位员工。不是一个特别有用或现实的程序,但它很有希望地展示了这个原则。

【讨论】:

  • 非常感谢!我相信这会有所帮助。
  • 不客气。如果您觉得有用,请随时为答案投票。
猜你喜欢
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
相关资源
最近更新 更多