Я не проверял это, но, как я уже упоминал в комментариях, использование CURSOR
- плохая идея; они по своей сути медленные, поскольку SQL Server выделяется при методах, основанных на множестве, а не итерационных задачах (а CURSOR
является последним).
Я подозреваю , что это дает ответ, который вы ищете, и избегает CURSOR
всего вместе:
CREATE PROC YourProc @DBID integer
AS
BEGIN
DECLARE @Deleted table (ProgramCode varchar(10),
[Value] varchar(MAX),
Tag nvarchar(10));
DELETE HT
OUTPUT deleted.Program_Code,
deleted.Pending,
deleted.MemberID
INTO @Deleted (ProgramCode,
[Value],
Tag)
FROM ADMIN_API_PMID_PROGRAM_CODE_HOLDING_TABLE AS HT
JOIN ADMIN_API_Master_Members_List AS MML ON HT.MemberID = MML.MemberID
WHERE MML.[DBID] = @DBID
--AND LEN(Pending) > 0; --Changed this to below to be SARGable, as only a string with the value '' will have a length of 0.
AND Pending != '';
INSERT INTO ADMIN_API_PMID_PROGRAM_CODE_HOLDING_TABLE (ProgramCode,
MemberID,
DBID,
PMID)
SELECT D.ProgramCode,
D.Tag,
@DBID,
SS.Value
FROM @Deleted AS D
CROSS APPLY STRING_SPLIT(D.[Value], ',') AS SS;
END;