Sql 如何通过存储过程更新表的多行?
我有一个包含1000个条目的employee表,另一个表是包含1000个条目的department表。我创建了一个映射表,其中包含这两个表的主键,并且还有1000个条目。现在,我必须连接所有这三个表,并对其中一些行执行更新过程,但它应该能够一次性更新这些行,而且最好使用存储过程。需要帮助 我知道如何使用table变量来执行此操作, 但是我需要了解如何编写脚本来创建存储过程并执行相同的操作Sql 如何通过存储过程更新表的多行?,sql,sql-server,database,join,inner-join,Sql,Sql Server,Database,Join,Inner Join,我有一个包含1000个条目的employee表,另一个表是包含1000个条目的department表。我创建了一个映射表,其中包含这两个表的主键,并且还有1000个条目。现在,我必须连接所有这三个表,并对其中一些行执行更新过程,但它应该能够一次性更新这些行,而且最好使用存储过程。需要帮助 我知道如何使用table变量来执行此操作, 但是我需要了解如何编写脚本来创建存储过程并执行相同的操作 谢谢。正如许多人在评论中所建议的那样,您完全应该了解更新在SQL Server中的工作原理,因为这将完成您听
谢谢。正如许多人在评论中所建议的那样,您完全应该了解更新在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 |
\------------------------------------------------------------/
现在,如果我们想更新表中的每一行,例如,在上次选中的列中设置一个值,可以通过一个简单的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 |
\------------------------------------------------------------/
因此,在本例中,存储过程采用一个可选参数,该参数默认为当前日期(如果未提供),指定更新Employees表中记录时要使用的日期,前提是指定的日期在每个员工的开始日期之后。这不是一个特别有用或实际的过程,但它很有希望地演示了原理。请粘贴您尝试的代码示例,我不知道如何继续,我读了很多书,但没有完全理解。从粘贴输入数据和所需输出的结构开始。UPDATE接受FROM子句和公共表表达式,x作为选择值,newvalue FROM table UPDATE x SET value=newvalue,允许您使用联接,子查询和任何其他需要以基于集合的方式一次更新所有行的内容。它不限于只更新一行。同样,如果你现在使用的是实际的表、实际的数据和实际的查询,人们实际上可以建议如何重写你所拥有的。你是一名实习生,去问问应该教你和指导你的人。作为将来的参考,你可能已经在互联网上讨论过的任何问题。学会搜索。如果通过搜索无法找到任何内容,请尝试使用文档。MS有相当好的文档,其中有许多示例-示例。如果您不知道如何编写存储过程,那么在开始此任务之前,您似乎需要额外的培训。非常感谢!我相信这会有帮助的。不客气。如果你觉得答案有用的话,请随意投票。
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