对于每个MS SQL SERVER?

HAJ*_*JAJ 16 sql sql-server

我有两张桌子:

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)

  • 绩效警告+1:但"效率不高"是轻描淡写; 如果你想让服务器瘫痪,请使用游标. (8认同)
  • 你是对的.我把我严重的错误纠正为"非常低效";) (4认同)

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)


Man*_*aju 5

这是使用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记录.