代码之家  ›  专栏  ›  技术社区  ›  Rohullah Rajaee Rad

使用游标更新,而不是在提要数据中迭代

  •  -1
  • Rohullah Rajaee Rad  · 技术社区  · 3 年前

    这是我的游标更新查询。但它会更新所有的 COM_Customer 第一次创下 #TempTable 而不是重复 #诱人的

    DECLARE @CustomerNumber VARCHAR(50)
    
    DECLARE db_cursor CURSOR FOR  
        SELECT CustomerNumber 
        FROM #TempTable
    
    OPEN db_cursor   
    
    FETCH NEXT FROM db_cursor INTO @CustomerNumber   
    
    WHILE @@FETCH_STATUS = 0   
    BEGIN   
        PRINT @CustomerNumber
    
        UPDATE COM_Customer
        SET CustomerNumber = @CustomerNumber
        WHERE CustomerNumber IS NULL
    
        FETCH NEXT FROM db_cursor INTO @CustomerNumber   
    END   
    
    CLOSE db_cursor   
    DEALLOCATE db_cursor
    
    0 回复  |  直到 3 年前
        1
  •  1
  •   Squirrel    3 年前

    但它会用中的第一条记录更新COM_客户的所有记录 #可诱惑且不重复#可诱惑

    查询会进行迭代 #TempTable 这个 PRINT @CustomerNumber 将从中打印出每个值 #诱人的

    它使用来自的第一个值更新所有的原因 #诱人的 因为 UPDATE query完全执行它应该执行的操作。它会用 CustomerNumber IS NULL 。因此后续迭代没有任何具有 CustomerNumber为空

    UPDATE COM_Customer
    SET    CustomerNumber = @CustomerNumber
    WHERE  CustomerNumber IS NULL
    

    似乎您正在更新来自的任意行 #诱人的 COM_Customer ,你可以使用 ROW_NUMBER() 生成一个序列并用于 JOIN 两张桌子。而且完全没有光标。

    UPDATE C
    SET    CustomerNumber = T.CustomerNumber
    FROM   (
                SELECT CustomerNumber, RN = ROW_NUMBER() OVER (ORDER BY CustomerNumber)
                FROM   COM_Customer
                WHERE  CustomerNumber IS NULL
           ) C
           INNER JOIN
           (
                SELECT CustomerNumber, RN = ROW_NUMBER() OVER (ORDER BY CustomerNumber)
                FROM   #TempTable
           ) T ON C.RN = T.RN
    
        2
  •  -1
  •   Dale K    3 年前

    断然的:

    DECLARE @CustomerNumber VARCHAR(50)
    DECLARE db_cursor CURSOR FOR  
    SELECT CustomerNumber FROM #TempTable
    OPEN db_cursor   
    FETCH NEXT FROM db_cursor INTO @CustomerNumber   
    
    WHILE @@FETCH_STATUS = 0   
    BEGIN   
           PRINT @CustomerNumber
       SET ROWCOUNT 1 --added
       Update COM_Customer
       set CustomerNumber = @CustomerNumber
       where CustomerNumber is null
       SET ROWCOUNT  0 --added
           FETCH NEXT FROM db_cursor INTO @CustomerNumber   
    END   
    
    CLOSE db_cursor   
    DEALLOCATE db_cursor