动态SQL语句根据数据库列来查询数据,动态的生成列名称
2013-04-26 10:23
881 查看
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go /****************************************************************************************** ---------------------------------------------------------------------------------------- 存储过程名称: [contract_station_elec] 实现功能: 基准站月用电量统计报表 作者: 巫航 ---------------------------------------------------------------------------------------- 修改时间 版本号 修改人 修改摘要 2013年4月26日 V3.0 巫航 创建该存储过程,由于辽宁电信的需求,需要按各用电量电流值current_size来分割大小 ---------------------------------------------------------------------------------------- ******************************************************************************************/ alter PROCEDURE [dbo].[rpt_contract_station_elec] @station varchar(8000) = '', @time varchar(8000) = '', @time_start datetime = null, @time_end datetime = null, @sort varchar(8000) = '' as begin set nocount on; declare @nv_table_name nvarchar(max); --表名称变量 declare @nv_sql nvarchar(max); --动态sql变量 declare @v_station_kind int; declare @v_name varchar(30); declare @nv_column_name nvarchar(max);--SUM+列名称 DECLARE @table VARCHAR(8000) DECLARE @sql nvarchar(max); SET @table = 'his_powermonth_' + CONVERT(VARCHAR(8000), DATEPART(yy, @time_start)) --如果表不存在,使用没有数据的原始表 IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[' + @table + ']') AND type in (N'U')) BEGIN set @table = 'his_powermonth' END --创建临时表,放置局站 DECLARE @station_where VARCHAR(8000) SET @station_where = '' IF @station<>'' BEGIN IF object_id('tempdb..#TEMPTB1') is not null drop table #TEMPTB1 CREATE table #TEMPTB1 ( station_sn VARCHAR(64) ) CREATE clustered index #TEMPTB1_Index1 on #TEMPTB1 (station_sn) SET @sql = 'INSERT INTO #TEMPTB1 ' + @station EXEC(@sql) SET @station_where = 'INNER JOIN #TEMPTB1 tmp ON t.station_sn = tmp.station_sn' END --删除可能存在的临时表 if object_id('tempdb..#temp_a') is not null begin drop table #temp_a; end --建立遥测量临时表 CREATE TABLE #temp_a( [station_sn] varchar(64) not null, [current_size] tinyint, [value] real ); SET @sql = 'INSERT INTO #temp_a([station_sn],[current_size],[value]) select t.[station_sn],t.[current_size],sum(t.[value]) as [value] FROM '+@table+' t ' + @station_where +' group by t.[current_size],t.[station_sn]' exec(@sql); -- select * from #temp_a; -- insert into #temp_a([station_sn],[am_kind],[value]) SELECT [station_sn],[am_kind],sum([value]) as [value] FROM [ems_his].[dbo].[his_powermonth_2013] --group by [am_kind],station_sn --删除可能存在的临时表 if object_id('tempdb..#temp_table') is not null begin drop table #temp_table; end --建立电流值大小临时表 CREATE TABLE #temp_table( [current_size] int not null ); set @nv_table_name = ' a.*'; set @nv_column_name = ''; declare cs1 cursor for select [name] from [ems_cfg].[dbo].[cfg_currentsize] open cs1 fetch next from cs1 into @v_name while @@fetch_status = 0 begin set @nv_table_name = @nv_table_name + ' ,b.[' +@v_name+']*a.value as ['+@v_name +']'; set @nv_column_name = @nv_column_name + ' ,ROUND(SUM(['+@v_name+']),2) as ['+@v_name+']' select @nv_sql = 'alter table #temp_table add [' + @v_name + '] int default 0'; --print(@nv_sql); exec(@nv_sql); fetch next from cs1 into @v_name; end close cs1 deallocate cs1 insert into #temp_table(current_size) select current_size from [ems_cfg].[dbo].[cfg_currentsize] declare cs2 cursor for select [current_size],[name] from [ems_cfg].[dbo].[cfg_currentsize] open cs2 fetch next from cs2 into @v_station_kind,@v_name while @@fetch_status = 0 begin select @nv_sql = 'update #temp_table set [' + @v_name + '] = 1 where [current_size] = ' + rtrim(@v_station_kind); print(@nv_sql); exec(@nv_sql); fetch next from cs2 into @v_station_kind,@v_name; end close cs2 deallocate cs2 -- select [am_kind] from [ems_cfg].[dbo].[cfg_amkind]; -- select * from #temp_table; set @nv_table_name ='select s.station_name,l.lsc_name,p.precinct_name,'+ @nv_table_name + ' from #temp_a a left join #temp_table b on a.[current_size] = b.[current_size] left join ems_cfg.dbo.cfg_station s on s.station_sn=a.station_sn left join ems_cfg.dbo.cfg_lsc l on l.lsc_id=s.lsc_id left join ems_cfg.dbo.cfg_precinct p on p.lsc_id=l.lsc_id and p.precinct_id=s.precinct_id'; set @nv_sql = 'select station_name,lsc_name,precinct_name'+@nv_column_name+' from ('+@nv_table_name+') t group by station_name,lsc_name,precinct_name' print(@nv_sql); exec(@nv_sql); --查询出第二个表 SELECT [current_size],[name] FROM [ems_cfg].[dbo].[cfg_currentsize] end
经常遇到用户需要动态的查询每一列的统计数据,烦都烦死了,请教了DBA,帮忙花了点时间写了这个动态SQL,根据配置表的ID号,名称来动态生成数据表格和数据集
WEB上再根据名称来生成对应的中文列头
相关文章推荐
- 根据会员编号、会员名称、会员积分、店铺编号查询数据的简单方法(sql语句)
- SQL对某张表建立触发器,然后根据编码与名称,跨服务器动态建表与生成数据
- PB 中用带参数的 SQL 语句字符串检索数据并动态生成Datawindow
- 用动态生成SQL语句的方法处理数据
- SQL语句根据具体时间查询数据
- 数据库SQL语句:查询一张表中某字段重复的数据
- [数据库] SQL查询语句表行列转换及一行数据转换成两列
- PB 中用带参数的 SQL 语句字符串检索数据并动态生成Datawindow
- DB2存储过程实现查询表数据,生成动态SQL,并执行
- 获得数据库名称///////查询数据库里所有表的sql语句!
- 在SQL SERVER中查询数据库中第几条至第几条之间的数据SQL语句写法
- SQL SERVER2000教程-第五章 处理数据 第二十二节 利用UNION对多条SQL查询语句合并生成表
- 基于SQL和PYTHON的数据库数据查询select语句
- 安卓开发SQlite使用执行SQL语句一些简单的处理——2.查询数据库的数据
- SQL中查询数据表字段名称的查询语句
- pb根据sql语句生成数据窗口
- [数据库使用技巧]动态生成sql语句_网络大本营
- XsqlFilterResult----动态生成sql语句的类,过滤一些为空的查询条件
- 根据基本表结构及其数据生成SQL语句
- hibernate根据条件动态组装sql/hql语句(仿ibatis动态查询语句功