我有两张桌子:
Employees(EmployeeID, EmployeeName, EmployeeStatus, BasicSalary)
和
EmployeePayroll (PayrollID, EmployeeID, VoucherNo, BasicSalary, SalaryMonth)
我想为for each
第一个表中的每个员工创建一个循环,以便我可以将虚拟数据插入(0, EmployeeID,0 ,0 ,0)
到第二个表中.
我尝试用for
循环但它无法制作它,所以for each
在MS SQL Server中有一个循环吗?
Dav*_*ett 27
如果您确实需要循环,则可以使用游标.它们非常低效,所以你应该避免,除非你绝对需要它:
DECLARE c CURSOR READ_ONLY FAST_FORWARD FOR
SELECT EmployeeID
FROM Employees
DECLARE @id Int
-- Open the cursor
OPEN c
FETCH NEXT FROM c INTO @id
WHILE (@@FETCH_STATUS = 0)
BEGIN
INSERT INTO EmployeePayroll
SELECT 0, @id, 0, 0, 0
-- do other stuff
FETCH NEXT FROM c INTO @id
END
-- Close and deallocate the cursor
CLOSE c
DEALLOCATE c
Run Code Online (Sandbox Code Playgroud)
Akr*_*hda 26
使用以下语句:
INSERT INTO EmployeePayroll
SELECT
0,EmployeeID ,0,0,0
FROM
Employees
Run Code Online (Sandbox Code Playgroud)
您可以在插入之前检查记录是否存在,方法是附加:
WHERE
ID NOT IN
(
SELECT
EmployeeID
FROM
EmployeePayroll
)
Run Code Online (Sandbox Code Playgroud)
这是使用While loop&Temp表变量实现您的需求的一种方法,
示例查询如下,
--: Get the Employees table data & insert this to temp table variable
Declare @TempEmpTbl Table (RowId int identity, EmployeeID int, EmployeeName nvarchar(100), EmployeeStatus int, BasicSalary int);
Insert into @TempEmpTbl Select * from Employees;
--: temp variables
Declare @TempEmpCount Int = (Select Count(RowId) From @TempEmpTbl);
Declare @MinCount Int = 1;
Declare @GetEmpId int;
--: while loop for EmployeePayroll tbl insertion based on Employees data
While(@TempEmpCount >= @MinCount)
Begin
Set @GetEmpId = (Select EmployeeID From @TempEmpTbl Where RowId = @MinCount);
Insert into EmployeePayroll values (0, @GetEmpId,0 ,0 ,0)
Set @MinCount = @MinCount + 1;
End
Run Code Online (Sandbox Code Playgroud)
注意:假设员工记录已经存在,我们可以在此while循环中更新EmployeePayroll记录.