SQL Серверный скрипт l oop обновляет и вставляет в другую таблицу без курсора - PullRequest
0 голосов
/ 23 января 2020

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

Есть ли лучший способ использовать без курсора?

Вот мой код с курсором:

DECLARE @CourseDelegateId INT;
DECLARE @UserId UNIQUEIDENTIFIER;

DECLARE Invite_Cursor CURSOR FOR
    SELECT CourseDelegateId, UserGuid
    FROM [dbo].[CourseDelegate]
    WHERE StatusTypeId=1 AND EmailSent = 0 AND [Disabled] = 0
    ORDER BY CourseDelegateId

OPEN Invite_Cursor
FETCH NEXT FROM Invite_Cursor INTO @CourseDelegateId, @UserId

WHILE @@FETCH_STATUS = 0
BEGIN
    BEGIN TRANSACTION
       UPDATE [dbo].[CourseDelegate]
       SET EmailSent = 1, NotificationTypeId = 1, Modified= GETUTCDATE()
       WHERE CourseDelegateId = @CourseDelegateId;

        INSERT INTO [dbo].[TrainingNotification]
                   ([CourseDelegateId]
                   ,[UserId]
                   ,[NotificationTypeId]
                   ,[CreatedBy]
                   ,[Created]
                   ,[ModifiedBy]
                   ,[Modified]
                   ,[Disabled])
        VALUES(
            @CourseDelegateId,
            @UserId,
            1,
            ORIGINAL_LOGIN(),
            GETUTCDATE(),
            ORIGINAL_LOGIN(),
            GETUTCDATE(),
            0)

    COMMIT
    FETCH NEXT FROM Invite_Cursor INTO @CourseDelegateId, @UserId
END
CLOSE Invite_Cursor
DEALLOCATE Invite_Cursor

1 Ответ

1 голос
/ 23 января 2020

Похоже на временную таблицу, и INSERT INTO...SELECT FROM будет гораздо проще:

SELECT CourseDelegateId,
       UserGuid
INTO #Invites
FROM [dbo].[CourseDelegate]
WHERE StatusTypeId = 1
  AND EmailSent = 0
  AND [Disabled] = 0
ORDER BY CourseDelegateId;

INSERT INTO [dbo].[TrainingNotification] ([CourseDelegateId],
                                          [UserId],
                                          [NotificationTypeId],
                                          [CreatedBy],
                                          [Created],
                                          [ModifiedBy],
                                          [Modified],
                                          [Disabled])
SELECT CourseDelegateId,
       UserGuid,
       1,
       ORIGINAL_LOGIN(),
       GETUTCDATE(),
       ORIGINAL_LOGIN(),
       GETUTCDATE(),
       0
FROM #Invites I;

UPDATE CD
SET EmailSent = 1,
    NotificationTypeId = 1,
    Modified = GETUTCDATE()
FROM [dbo].[CourseDelegate] CD
     JOIN #Invites I ON CD.CourseDelegateId = I.CourseDelegateId;
...