环境要求:2005+ 在日常需求中经常会有行转列的事情需求处理,如果不是动态的行,那么我们可以采取case when 罗列处理。 在sql 2005以前处理动态行或列的时候,通常采用拼接字符串的方法处理,在2005以后新增了pivot函数之后,我可以利用这样函数来处理。 1.
环境要求:2005+
在日常需求中经常会有行转列的事情需求处理,如果不是动态的行,那么我们可以采取case when 罗列处理。
在sql 2005以前处理动态行或列的时候,通常采用拼接字符串的方法处理,在2005以后新增了pivot函数之后,我可以利用这样函数来处理。
1.动态sql注入式判断函数
--既然是用到了动态sql,就有一个老话题:sql注入。建一个注入性字符的判断函数。create function [dbo].[fn_checksqlinjection]( @col nvarchar(4000))returns bit --如果存在可能的注入字符返回true,反之返回falseasbegindeclare @result bit; if upper(@col) like upper(n'%0x%') or upper(@col) like upper(n'%;%') or upper(@col) like upper(n'%''%') or upper(@col) like upper(n'%--%') or upper(@col) like upper(n'%/*%*/%') or upper(@col) like upper(n'%exec%') or upper(@col) like upper(n'%xp_%') or upper(@col) like upper(n'%sp_%') or upper(@col) like upper(n'%select%') or upper(@col) like upper(n'%insert%') or upper(@col) like upper(n'%update%') or upper(@col) like upper(n'%delete%') or upper(@col) like upper(n'%truncate%') or upper(@col) like upper(n'%create%') or upper(@col) like upper(n'%alter%') or upper(@col) like upper(n'%drop%') set @result=1 else set @result=0 return @resultendgo
2.需求:
--通过日期查询几个表联合,按照检验项目分类,按日期横向展示
select a.检验项目 , convert(char(10),a.日期,120)日期,convert(decimal(18,2),cast((sum(a.测试数量)-sum(a.不良数量)) as decimal(18,2))/sum(测试数量))*100 as 良率 --into #tempcobfrom (select 日期,检验项目, 测试数量, 不良数量 from 制程cob成测 union all select 日期,检验项目, 测试数量, 不良数量 from 制程cob外观 union all select 日期,检验项目,测试数量, 不良数量 from 制程cob绑测 union all select 送检日期,'fqc_cob_检验',检验数量,不合格数量 from 制程fqc_cob_检验 ) as a where convert(char(10),日期,120)>='2014-10-01' and convert(char(10),日期,120)='2014-10-01' and convert(char(10),日期,120)<= '2014-10-30' group by a.检验项目,a.日期 --查看临时表数据,取分布日期(不重复)--select 日期 from #tempcob--select distinct 日期 from #tempcobdeclare @sql nvarchar(4000)=n'';--这里使用了xml处理来处理类组字符串set @sql=stuff((select n','+quotename(b.日期) from (select distinct 日期 from #tempcob) as b for xml path('')),1,1,n''); --加入了xml处理和sql注入预防判断if dbo.fn_checksqlinjection(@sql)=0 set @sql='select * from #tempcob pivot (max(良率) for 日期 in ('+@sql+')) as tt'exec(@sql);drop table #tempcob
4.结果: