Для цикла в хранимой процедуре (SQL Server 2008)

#sql-server #tsql

#sql-сервер #tsql

Вопрос:

Мне нужно создать хранимую процедуру для вставки ежемесячной заработной платы сотрудников в таблицу расчета заработной платы. кто-нибудь может привести пример?

Есть две таблицы

 Employees (EmployeeID, EmployeeName, EmployeeStatus, BasicSalary)
  

и

 EmployeePayroll (PayrollID, EmployeeID, VoucherNo, BasicSalary, SalaryMonth)
  
  1. Получаем общее количество сотрудников из таблицы Employees, в которой УКАЗАН EmployeeStatus (‘Активный’)………… допустим, например, (50 сотрудников)
  2. Создайте цикл для всех этих 50 сотрудников и вставьте ваучер на выплату заработной платы в таблицу (EmployeePayroll).
  3. В таблицу EmployeePayroll он будет вставлен с автоматически сгенерированным номером ваучера, например:
 SET @PayrollID = (SELECT MAX(PayrollID) AS PayrollID FROM HR.EmployeePayroll)
SET @VoucherNo = ('SPV-K-'   CAST(DATEPART(YY,GETDATE())AS VARCHAR)   CAST(DATEPART(MM,GETDATE())AS VARCHAR)   CAST(DATEPART(DD,GETDATE())AS VARCHAR)   '-00'   @PayrollID) 
  

Таким образом, записи будут выглядеть следующим образом:

 PayrollID.......EmployeeID.......VoucherNo......BasicSalary.........SalaryMonth
1..................1...........SPV-K-11501-001.....250..................1
2..................2...........SPV-K-11501-002.....300..................1
3..................3...........SPV-K-11501-004.....400..................1
  

Комментарии:

1. PayrollID = 3 имеет ваучер «SPV-K-11501-004»? Это не соответствует вашей логике… Кроме того, вы не должны вычислять PayRollID: это должно быть IDENTITY. И откуда берется SalaryMonth? Наконец, что вы уже пробовали?

2. просто небольшое замечание, что создание циклов в sql, как правило, является плохой практикой, поскольку в нем не используются подходы, основанные на наборе

3. Также раздражают названия столбцов заработной платы в платежной ведомости. Вы платите только 1 доллар, хотя они должны были получить 300? 😉

Ответ №1:

Вам не нужен цикл для операций вставки, которые получают свои данные из других таблиц. Как предложил gbn, сделайте voucherID столбцом ИДЕНТИФИКАЦИИ, чтобы он автоматически увеличивался при каждой вставке. Затем используйте инструкцию insert, подобную этой:

 INSERT INTO EmployeePayroll (EmployeeID, VoucherNo, BasicSalary, SalaryMonth)
SELECT 
    EmployeeID, 
    ( 'SPV-K-'   'rest of your voucher calculation'),
    BasicSalary, 1
FROM Employees WHERE EmployeeStatus IN ('Active')
  

Обратите внимание, что интеграция идентификатора ваучера в номер ваучера невозможна таким образом, но также желательна, ИМХО. Лучшим способом было бы сохранить текущую дату в виде столбца «день выплаты», а затем сгенерировать номер ваучера при выборе из этой таблицы. (Или лучше создайте представление для чтения из этой таблицы и поместите вычисление «VoucherNo» в эту инструкцию views SELECT)