• SQL_两种方式遍历操作主键不是自增的数据库


    第一种是通过游标过每一行

    --创建一个游标
    DECLARE cursor_HECM_ROMM CURSOR SCROLL
    FOR
        SELECT  ID
        FROM    TABLE
        WHERE   XX=XX
        --打开游标
    OPEN cursor_HECM_ROMM;
    --存储读取的值
    DECLARE @ROOMID VARCHAR(50);
        --读取第一条记录
    FETCH FIRST FROM cursor_HECM_ROMM INTO @ROOMID;
    --循环读取游标记录
    --PRINT '读取的数据如下:';
    --全局变量
    WHILE ( @@fetch_status = 0 )
        BEGIN
            PRINT 'ID:' + @ROOMID; 
            UPDATE  dbo.TABLE
            SET     XX = XX
            WHERE   XX = @ROOMID;
            --继续读取下一条记录
            FETCH NEXT FROM cursor_HECM_ROMM INTO @ROOMID;
        END;
    --关闭游标
    CLOSE cursor_HECM_ROMM;
    
    --删除游标
    DEALLOCATE cursor_HECM_ROMM;
    

     第二种是通过存储过程来遍历但是这里有BUG,有的会漏掉,还是推荐第一种。

    USE ;
      --指定数据库
      
    DECLARE @min_id INT;
    
    DECLARE @UpOutTemp INT;
    DECLARE @LowOutTemp INT;
    DECLARE @NoPayInTemp INT;
    DECLARE @NoPayOutTemp INT;
    DECLARE @PayedInTemp INT;
    DECLARE @PayedOutTemp INT;
    --0 未缴费;1已缴费
    DECLARE @PaymentState INT;
    --设定温度
    DECLARE @SetTemp INT;
    DECLARE @UpRoomTemp INT;
    DECLARE @LowRoomTemp INT;
    DECLARE @RoomTemp INT;
    DECLARE @SetBoltStatus INT;
    
       --声明整数变量@x
    SET @min_id = ( SELECT  MIN(LXTID)
                    FROM    dbo.t_LXT
                  );
    SET @LowOutTemp = 30;
    SET @UpOutTemp = 46;
    
    SET @LowRoomTemp = 18;
    SET @UpRoomTemp = 23;
    
          --给变量@x赋初值为当前最小的Id值
    WHILE @min_id > 0
        BEGIN
            SELECT  @SetTemp = ( SELECT setTemp
                                 FROM   dbo.t_LXT
                                 WHERE  LXTID = @min_id
                               );
            SELECT  @PaymentState = ( SELECT    paymentState
                                      FROM      dbo.t_LXT
                                      WHERE     LXTID = @min_id
                                    );
    
            SELECT  @PayedOutTemp = ROUND(( ( @UpOutTemp - @LowOutTemp - 1 )
                                            * RAND() + @LowOutTemp ), 0);
            SELECT  @PayedInTemp = @PayedOutTemp + ROUND(( ( 11 - 7 ) * RAND() + 7 ),
                                                         0);
    
            SELECT  @NoPayInTemp = ROUND(( ( 23 - 18 - 1 ) * RAND() + 18 ), 0);
            SELECT  @NoPayOutTemp = ROUND(( ( 18 - 13 - 1 ) * RAND() + 13 ), 0);
    
            SELECT  @RoomTemp = ROUND(( ( @UpRoomTemp - @LowRoomTemp - 1 )
                                        * RAND() + @LowRoomTemp ), 0);
            SELECT  @SetTemp = ROUND(( ( @UpRoomTemp - @LowRoomTemp - 1 ) * RAND()
                                       + @LowRoomTemp ), 0);
    
            UPDATE  dbo.t_LXT
            --SET   productRoomID = ROUND(RAND() * 100, 0)
            SET     roomTemp = @RoomTemp ,
                    setTemp = @SetTemp ,
                    tempStatus = '1' ,
                    outTemp = ( CASE @PaymentState
                                  WHEN '1' THEN @PayedOutTemp
                                  WHEN '0' THEN @NoPayOutTemp
                                END ) ,
                    inTemp = ( CASE @PaymentState
                                 WHEN '1' THEN @PayedInTemp
                                 WHEN '0' THEN @NoPayInTemp
                               END ) ,
    				--if 已缴费paymentState==1 供热setBoltStatus==0 开启 else setBoltStatus==1
                    setBoltStatus = ( CASE @PaymentState
                                        WHEN '1' THEN '0'
                                        ELSE '1'
                                      END ) ,
    				--if 设定setTemp>实际roomTemp 阀门开启boltStatus==0 else 阀门关闭boltStatus==1
                    boltStatus = ( CASE WHEN @SetTemp < @RoomTemp THEN '1'
                                        WHEN @SetBoltStatus = '1' THEN '1'
                                        WHEN @PaymentState = '0' THEN '1'
                                        ELSE '0'
                                   END )
            WHERE   LXTID = @min_id; --round()四舍五入把原值转化为指定小数位数
    
            SELECT  @min_id = ( SELECT  MIN(LXTID)
                                FROM    dbo.t_LXT
                                WHERE   LXTID > @min_id
                              );--rand()取得是随机数  默认范围为(0·1) rand()*100范围是0~100
    
        END;
    

    其他的需求都可以通过这两种进行改造。

  • 相关阅读:
    大数据集群环境ssh免密码登录设置
    FreeRTOS任务创建删除
    BLE外设设计
    BLE控制器之链路层
    BLE控制器之链路层二
    BLE控制器之物理层特性
    BLE基本理论和概念
    BLE主机之ATT和GATT
    BLE主机之SM层
    BLE主机之L2CAP层
  • 原文地址:https://www.cnblogs.com/TheBob/p/10729524.html
Copyright © 2020-2023  润新知