【问题标题】:SQL Server script loop update and insert to different table without cursorSQL Server脚本循环更新并插入到没有游标的不同表中
【发布时间】:2023-03-28 04:55:02
【问题描述】:

我正在编写一个简单的 SQL Server 脚本来从表中获取 id 并更新源表并使用游标插入另一个表。

有没有更好的不用光标的方法?

这是我的光标代码:

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

【问题讨论】:

    标签: sql-server tsql sql-server-2016


    【解决方案1】:

    看起来像一个临时表,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;
    

    【讨论】:

      猜你喜欢
      • 2021-02-11
      • 2019-06-05
      • 2015-04-19
      • 2017-11-17
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多