zoukankan      html  css  js  c++  java
  • 游标嵌套示例

    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
  • 相关阅读:
    关于32位操作系统和64位操作系统对InstallShield打包的影响
    NEWS: Symantec宣布Wise Package Studio将终止
    InstallShield 2012新功能试用(2) 调用MsiGetProperty等MSI API发生变化
    Basic INFO 在命令行Build InstallShield安装包工程获得压缩安装包
    NEWS InstallShield 2012 Service Pack 1发布
    Basic INFO InstallShield Basic MSI工程中如何在SetupCompleteSuccess界面中启动Readme
    Basic INFO InstallShield的脚本编辑器中如何显示代码行号
    Basic INFO 关于在InstallShield制作的安装包界面中删除InstallShield文字的厂商回复
    Basic INFO InstallShield工程中如何让产品的快捷方式名称始终与产品名保持一致
    Basic INFO: 创建隐藏文件夹
  • 原文地址:https://www.cnblogs.com/pingkeke/p/3392534.html
Copyright © 2011-2022 走看看