Как обновить несколько строк таблицы с помощью хранимой процедуры? - PullRequest
0 голосов
/ 21 января 2020

Взять этот образ таблицы за таблицу, в которой мне нужно выполнить несколько операций обновления. У меня есть таблица сотрудников с 1000 записями, другая таблица - это также таблица отделов с 1000 записями. Я создал таблицу сопоставления, которая содержит первичные ключи обеих таблиц, а также содержит 1000 записей. Теперь мне нужно объединить все эти три таблицы и выполнить процедуры обновления для некоторых строк, но он должен иметь возможность обновлять строки за один go, что также предпочтительно с использованием хранимой процедуры. Нужна помощь!

Я знаю об использовании табличной переменной для этого, но мне нужно понять, как написать скрипт для создания хранимой процедуры и сделать то же самое.

Спасибо.

1 Ответ

1 голос
/ 21 января 2020

Как многие предлагали в комментариях, вы должны полностью прочитать о том, как UPDATE работает на SQL Сервере, так как это будет делать все, что вам нужно.

В любом случае, вот пример, чтобы помочь объяснить это для вас. Во-первых, давайте создадим таблицу 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 дата, кроме даты для Фила Джонса, из-за предложения where starting_date <= 2019-01-01 в операторе update.

Надеемся, что это демонстрирует основы оператора 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 для каждого сотрудника. Не очень полезная или реалистичная c процедура, но, надеюсь, она демонстрирует этот принцип.

...