Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何通过存储过程更新表的多行?_Sql_Sql Server_Database_Join_Inner Join - Fatal编程技术网

Sql 如何通过存储过程更新表的多行?

Sql 如何通过存储过程更新表的多行?,sql,sql-server,database,join,inner-join,Sql,Sql Server,Database,Join,Inner Join,我有一个包含1000个条目的employee表,另一个表是包含1000个条目的department表。我创建了一个映射表,其中包含这两个表的主键,并且还有1000个条目。现在,我必须连接所有这三个表,并对其中一些行执行更新过程,但它应该能够一次性更新这些行,而且最好使用存储过程。需要帮助 我知道如何使用table变量来执行此操作, 但是我需要了解如何编写脚本来创建存储过程并执行相同的操作 谢谢。正如许多人在评论中所建议的那样,您完全应该了解更新在SQL Server中的工作原理,因为这将完成您听

我有一个包含1000个条目的employee表,另一个表是包含1000个条目的department表。我创建了一个映射表,其中包含这两个表的主键,并且还有1000个条目。现在,我必须连接所有这三个表,并对其中一些行执行更新过程,但它应该能够一次性更新这些行,而且最好使用存储过程。需要帮助

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


谢谢。

正如许多人在评论中所建议的那样,您完全应该了解更新在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