zoukankan      html  css  js  c++  java
  • 游标的使用,游标也是存储过程中循环数据的其中一种方式

    最近在项目中需要做一些复杂的图表统计,所以使用了存储过程和游标,案例如下:

    ALTER PROCEDURE [dbo].[proc_CountSiteGroupByAreaSiteType]
    -- Add the parameters for the stored procedure here
    AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    declare
    @Com_SiteTypeID as uniqueidentifier,
    @SiteTypeName as nvarchar(Max),
    @Com_StructureID as uniqueidentifier,
    @Name as nvarchar(Max)

    --创建临时表
    create table #temp(
    Name nvarchar(Max),
    SiteTypeName nvarchar(Max),
    Count int
    )

    declare C_SiteType Cursor for
    select Com_SiteTypeID,SiteTypeName from Com_SiteType  --声明游标
    open C_SiteType --打开游标


    FETCH NEXT FROM C_SiteType into @Com_SiteTypeID,@SiteTypeName

    while @@FETCH_STATUS =0  --循环第一层游标的返回值状态
    begin
    declare C_Structure Cursor for
    select Com_StructureID,Name from Com_Structure
    where Com_StructureID in (select a.Com_StructureID from Com_Structure a inner join
    Com_StructureType b on a.Com_SructureTypeID=b.Com_StructureTypeID and b.Type=3
    and a.ParentStructureID!='00000000-0000-0000-0000-000000000000')--type=1表示只统计片区的项目
    open C_Structure
    FETCH NEXT FROM C_Structure into @Com_StructureID,@Name
    while @@FETCH_STATUS =0   循环第二层游标的返回值状态
    begin
    --select Name=@Name,SiteTypeName=@SiteTypeName,Count(*) as Count
    --into #temp from Com_SiteGroup
    --where Com_StructureID=@Com_StructureID and Com_SiteTypeID=@Com_SiteTypeID

    insert into #temp select Name=@Name,SiteTypeName=@SiteTypeName,Count(*) as Count
    from Com_SiteGroup a inner join Com_SiteGroupInStructure b
    on a.Com_SiteGroupID=b.Com_SiteGroupID
    where b.Com_StructureID=@Com_StructureID and Com_SiteTypeID=@Com_SiteTypeID
    and EngineeringState=1 --EngineeringState=1表示只统计在建的项目

    FETCH NEXT FROM C_Structure into @Com_StructureID,@Name
    end
    close C_Structure
    DEALLOCATE C_Structure   --关闭内层游标,并撤销,才能继续正常执行外层游标,如果不关闭,会使外层游标返回值不为0

    FETCH NEXT FROM C_SiteType into @Com_SiteTypeID,@SiteTypeName
    end

    close C_SiteType --关闭游标
    DEALLOCATE C_SiteType --撤销游标
    --select * from #temp

    ---pivot 行转列
    DECLARE @sql VARCHAR(8000)

    SELECT @sql=isnull(@sql+',','')+SiteTypeName FROM #temp GROUP BY SiteTypeName

    SET @sql='select * from #temp pivot (Sum(Count) for SiteTypeName in ('+@sql+'))a'

    exec(@sql)

    drop table #temp
    END

  • 相关阅读:
    设计模式-状态模式
    Nginx相关
    Docker基础使用
    JavaScript定时器及回调用法
    前端交互篇
    基于ConcurrentHashMap的本地缓存
    J.U.C体系进阶(五):juc-collections 集合框架
    J.U.C体系进阶(四):juc-sync 同步器框架
    J.U.C体系进阶(三)- juc-atomic 原子类框架
    .net core https 双向验证
  • 原文地址:https://www.cnblogs.com/redfull/p/6836485.html
Copyright © 2011-2022 走看看