• 游标嵌套示例


    USE [OnlineQualDB]
    GO
    
    /****** Object:  StoredProcedure [dbo].[usp_Tqc_QualStat4]    Script Date: 10/25/2013 16:14:54 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    
    -- =============================================
    -- Author:        <Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:    <Description,,> EXEC usp_Tqc_QualStat4  
    -- 17.5904
    -- =============================================
    ALTER PROCEDURE [dbo].[usp_Tqc_QualStat4]
    AS 
        BEGIN
        
            SET NOCOUNT ON ;  
            --第1个游标变量 
            DECLARE @ProcessID UNIQUEIDENTIFIER ,
                @ProcessName1 VARCHAR(50) ,
                @ProcessCode VARCHAR(50) ,
                @MaxRecordTime DATETIME
            --第2个游标变量 
            DECLARE @ProcessName2 VARCHAR(50)
            --第3个游标变量 
            DECLARE @RowNumber INT ,
                @ProcessName VARCHAR(50) ,
                @TakeTime DATETIME
            --上一条记录时间,下一条记录时间
            DECLARE @RecordTime1 DATETIME ,
                @RecordTime2 DATETIME
            --水分各工序最大时间
            DECLARE @RecordTime DATETIME
            
            --取得在线水分数据并放入#t1
            SELECT  t1.* ,
                    t2.F_ProcessName AS ProcessName ,
                    t2.F_Code
            INTO    #t1
            FROM    T_QualMoisture_Online t1
                    INNER JOIN T_DIC_QualProcess t2 ON t1.ProcessID = T2.F_ProcessID
            --SELECT  *
            --FROM    #t1      
            
            -- 分工序取得在线水分结构参数系数,记录数以及权重
            CREATE TABLE #t2
                (
                  RowNumber INT ,
                  N_Slow_Value NUMERIC(18, 2) ,
                  T_Take_Time DATETIME ,
                  Weight_Coefficient NUMERIC(18, 2) ,
                  ProcessName VARCHAR(50)
                )
            
            --结果集
            DECLARE @t TABLE
                (
                  ProcessName VARCHAR(20) ,
                  RowNumber INT ,
                  Value NUMERIC(18, 4)
                )
                
            
            DECLARE Process_cur CURSOR FOR    --第1个游标            
            SELECT 
            t1.ProcessID,t2.F_ProcessName AS ProcessName,
            t2.F_Code AS ProcessCode,
            MaxRecordTime FROM (
            SELECT  ProcessID,MAX(RecordTime) AS MaxRecordTime
            FROM    T_QualMoisture_Online
            GROUP BY ProcessID) t1
            LEFT JOIN T_DIC_QualProcess t2 ON t1.ProcessID = T2.F_ProcessID       
            OPEN Process_cur          
            FETCH NEXT FROM Process_cur INTO @ProcessID,@ProcessName1,@ProcessCode, @MaxRecordTime
            
            WHILE ( @@fetch_status = 0 ) 
                BEGIN
                    PRINT '@ProcessCode: ' + CONVERT(VARCHAR(50), @ProcessCode)
                
                -- 循环分工序取得在线水分各工序最大时间 
                    SELECT  @RecordTime = ( SELECT  MaxRecordTime
                                            FROM    ( SELECT    ProcessID ,
                                                                MAX(RecordTime) AS MaxRecordTime
                                                      FROM      T_QualMoisture_Online
                                                      GROUP BY  ProcessID
                                                    ) t1
                                                    LEFT JOIN T_DIC_QualProcess t2 ON t1.ProcessID = T2.F_ProcessID
                                            WHERE   t2.F_Code = @ProcessCode
                                          )       
            
                -- 取得权重系数
                    INSERT  INTO #t2
                            SELECT  RowNumber ,
                                    N_Slow_Value ,
                                    T_Take_Time ,
                                    Weight_Coefficient ,
                                    t3.F_ProcessName AS ProcessName
                            FROM    T_QualMoisture_Online_Parameter t1
                                    INNER JOIN ( SELECT ROW_NUMBER() OVER ( ORDER BY T_Take_Time DESC ) AS RowNumber ,
                                                        T_Take_Time ,
                                                        N_Slow_Value ,
                                                        b.F_ProcessID AS ProcessID
                                                 FROM   dbo.T_QualMoisture_Middle_Detail a
                                                        INNER JOIN T_DIC_QualProcess b ON a.V_CaseNumber = b.F_Code
                                                 WHERE  T_Take_Time < @RecordTime
                                                        AND N_Slow_Value IS NOT NULL
                                                        AND V_CaseNumber = @ProcessCode
                                               ) t2 ON t1.Sample_Index = t2.RowNumber
                                                       AND t1.ProcessID = t2.ProcessID
                                    INNER JOIN T_DIC_QualProcess t3 ON t1.ProcessID = t3.F_ProcessID  
                
                    FETCH NEXT FROM Process_cur INTO @ProcessID,@ProcessName1,@ProcessCode, @MaxRecordTime
                END
            CLOSE Process_cur
            DEALLOCATE Process_cur     
             --SELECT * FROM #t2           
             
            DECLARE GroupProcessName_cur CURSOR FOR  --第二个游标开始,这里运用了游标嵌套
            SELECT ProcessName FROM #t2  
            GROUP BY ProcessName
            OPEN GroupProcessName_cur
            FETCH NEXT FROM GroupProcessName_cur INTO @ProcessName2
            WHILE ( @@fetch_status = 0 ) 
                BEGIN
                    PRINT '@ProcessName: ' + CONVERT(VARCHAR(50), @ProcessName2) 
                            
                    DECLARE Moisture_cur CURSOR FOR  --第3个游标开始
                    SELECT RowNumber, ProcessName,T_Take_Time
                    FROM #t2
                    WHERE ProcessName = @ProcessName2
                    OPEN Moisture_cur
                    FETCH NEXT FROM Moisture_cur INTO @RowNumber,@ProcessName,@TakeTime
                    WHILE ( @@fetch_status = 0 ) 
                        BEGIN
                            PRINT '@RowNumber: ' + CONVERT(VARCHAR(50), @RowNumber)
                            PRINT '@ProcessName: '
                                + CONVERT(VARCHAR(50), @ProcessName) 
                            PRINT '@TakeTime: ' + CONVERT(VARCHAR(50), @TakeTime) 
                            PRINT '--------------------------'
                                    --取上一条记录RowNumber
                            SELECT  @RecordTime1 = ( SELECT TOP 1
                                                            T_Take_Time
                                                     FROM   #t2
                                                     WHERE  RowNumber < @RowNumber
                                                            AND ProcessName = @ProcessName2
                                                     ORDER BY RowNumber DESC
                                                   )
                                    
                            IF ( @RecordTime1 IS NULL ) 
                                SET @RecordTime1 = @TakeTime
                            PRINT @RecordTime1
                                    --取下一条记录RowNumber
                            SELECT  @RecordTime2 = ( SELECT TOP 1
                                                            T_Take_Time
                                                     FROM   #t2
                                                     WHERE  RowNumber > @RowNumber
                                                            AND ProcessName = @ProcessName2
                                                     ORDER BY RowNumber ASC
                                                   )
                            IF ( @RecordTime2 IS NULL ) 
                                SET @RecordTime2 = @TakeTime
                            PRINT @RecordTime2
                                    
                            INSERT  INTO @t
                                    SELECT  @ProcessName ,
                                            @RowNumber ,
                                            AVG(Value) AS Value
                                    FROM    #t1
                                    WHERE   RecordTime BETWEEN @RecordTime2 AND @RecordTime1
                                            AND ProcessName = @ProcessName2
                                    GROUP BY ProcessName
    
                            FETCH NEXT FROM Moisture_cur INTO @RowNumber,@ProcessName,@TakeTime
                        END
                    CLOSE Moisture_cur
                    DEALLOCATE Moisture_cur--第3个游标结束  
    
                    FETCH NEXT FROM GroupProcessName_cur INTO @ProcessName2
                END
            CLOSE GroupProcessName_cur
            DEALLOCATE GroupProcessName_cur--第二个游标结束    
            --SELECT  *
            --FROM    @t
            
            SELECT  t1.ProcessName ,
                    t1.RowNumber ,
                    t1.Value ,
                    N_Slow_Value ,
                    T_Take_Time ,
                    Weight_Coefficient ,
                    ( Value - N_Slow_Value ) * Weight_Coefficient AS Result
            INTO    #t3
            FROM    @t t1
                    INNER JOIN #t2 t2 ON t1.RowNumber = t2.RowNumber
                                         AND t1.ProcessName = t2.ProcessName
                            
            --SELECT  *
            --FROM    #t3 
            
            SELECT  F_ProcessName AS ProcessName ,
                    Value AS LastValue ,
                    ISNULL(Result, 0) AS Ratio ,
                    Value - ISNULL(Result, 0) AS ReviseValue
            FROM    ( SELECT    * ,
                                ROW_NUMBER() OVER ( PARTITION BY ProcessID ORDER BY RecordTime DESC ) rn
                      FROM      T_QualMoisture_Online
                    ) t
                    INNER JOIN T_DIC_QualProcess t2 ON t.ProcessID = T2.F_ProcessID
                    LEFT JOIN ( SELECT  ProcessName ,
                                        SUM(Result) AS Result
                                FROM    #t3
                                GROUP BY ProcessName
                              ) t3 ON t2.F_ProcessName = t3.ProcessName
            WHERE   rn = 1
            
            DROP TABLE #t1 
            DROP TABLE #t2
            DROP TABLE #t3
            
        END
    
    
    GO
  • 相关阅读:
    算法:javascript截取字符串
    【转】解决memcached启动失败
    Ubuntu 16.04 安装 Apache, MySQL, PHP7
    phpstorm2016.3+xdebug调试
    (转)微信开发连接SAE数据库
    php图片上传服务器
    大数据整体市场规模达1000亿,金融、政务等行业应用占据七成份额
    “AI智客计划”
    人工智能 :眼纹识别技术大显神通,一眼认出你
    AI 芯片,是金山还是泡沫?
  • 原文地址:https://www.cnblogs.com/pingkeke/p/3392534.html
Copyright © 2020-2023  润新知