用基于 Set 的等效项替换 Cursor Next 数字赋值操作

Replace Cursor Next number assignment Operation with Set based equivalent

大家好,

我有以下游标查询,想用基于集合的查询替换它以解决性能问题。

DECLARE @EmpIDM CHAR(21);
DECLARE @EmpName CHAR(21);
DECLARE @EMPCatID INT;

DECLARE Assign_Emp SCROLL CURSOR
FOR
SELECT DISTINCT EMP
    , EMPNAME
FROM HR_EMPLOYEES

SET NOCOUNT ON

OPEN Assign_Emp;

FETCH NEXT
FROM Assign_Emp
INTO @EmpIDM
    , @EmpName

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @EMPCatID = (
            SELECT TOP 1 CategoryID
            FROM Categories
            )

    UPDATE Categories
    SET CategoryID = (CategoryID + 1) /*Increment Category ID for next Insert*/

    INSERT INTO Table1 (
        EmpNumber
        , EmployeeName
        , EmployeeCategoryID
        )
    VALUES (
        @EmpIDM
        , @EmpName
        , @EMPCatID
        )

    FETCH NEXT
    FROM Assign_Emp
    INTO @EmpIDM
        , @EmpName
END

CLOSE Assign_Emp;

CLOSE Assign_Emp;

SET NOCOUNT OFF

我的挑战是将以下代码段改编成基于集合的操作

SET @EMPCatID = (
            SELECT TOP 1 CategoryID
            FROM Categories
            )

    UPDATE Categories
    SET CategoryID = (CategoryID + 1) /*Increment Category ID for next Insert*/

我非常感谢任何关于如何实现这一目标的见解。

非常感谢,

使用临时重写。 table 身份列:

declare @offset int

select @offset = isnull(max(CategoryID),0) from Categories

create table #data (
  EmpNumber CHAR(21),
  EmployeeName CHAR(21),
  EmployeeCategoryID int identity
)

INSERT INTO #data (
        EmpNumber
        , EmployeeName)
SELECT DISTINCT EmpIDM
    , EmpName
FROM HR_EMPLOYEES

insert into Table1 (
        EmpNumber
        , EmployeeName
        , EmployeeCategoryID
) select
        EmpNumber
        , EmployeeName
        , EmployeeCategoryID + @offset
from #data

update Categories 
set CategoryID = (select max(EmployeeCategoryID) from #data) + @offset