SQL Server 列转行存储过程

--DROP PROCEDURE TableColToRow
CREATE PROCEDURE TableColToRow 
	@表名 VARCHAR(80), 
    @哪字段转行 VARCHAR(80), 
    @列转行后字段名 VARCHAR(80) 
AS
BEGIN   
-------------------------------------------------------------------------------------------
	DECLARE
	@sql VARCHAR(8000) 
	--@表名 VARCHAR(80), 
	--@哪字段转行 VARCHAR(80), 
	--@列转行后字段名 VARCHAR(80) 
	--SET @表名 ='tba' 
	--SET @哪字段转行 ='姓名' 
	--SET @列转行后字段名='学科' 


	--定义变量
	SET @sql=''
	SET @sql=@sql+ 'DECLARE @sTitle1 VARCHAR(8000),@sTitle2 VARCHAR(8000),@sTitle3 VARCHAR(8000),@sql2 varchar(max),@sTab VARCHAR(max)      '+char(10)+char(10) 

	--初始化变量
	SET @sql=@sql+ 'SELECT  '+char(10) 
	--SET @sql=@sql+ '    @sTitle1  =ISNULL(@sTitle1+'','','''')+ ''[''+['+ @哪字段转行 +']+'']'',      '+char(10) --不转化数据为VARCHAR
	SET @sql=@sql+ '    @sTitle1 =ISNULL(@sTitle1+'','','''')+'' convert(varchar(80),[''+CONVERT(VARCHAR(80),['+ @哪字段转行 +'])+'']) as ['' + CONVERT(VARCHAR(80),['+ @哪字段转行 +'])+'']'',     '+char(10)   --转化数据为VARCHAR
	SET @sql=@sql+ '    @sTitle2 =ISNULL(@sTitle2+'','','''')+''"''+CONVERT(VARCHAR(80),['+ @哪字段转行 +'])+''"'',     '+char(10)     
	SET @sql=@sql+ '    @sTitle3 =ISNULL(@sTitle3+'','','''')+'' max([''+CONVERT(VARCHAR(80),['+ @哪字段转行 +'])+'']) as ['' + CONVERT(VARCHAR(80),['+ @哪字段转行 +'])+'']''     '+char(10)
	SET @sql=@sql+ 'FROM  ['+@表名+']'+char(10)
	SET @sql=@sql+char(10)


	--初始化pivot Sql
	SET @sql=@sql+ 'SELECT     '+char(10)  
	SET @sql=@sql+ '@sTab=ISNULL(@sTab+'' UNION '','''')+''select ''''''+name+'''''' AS ['+@列转行后字段名 +'],''+ @sTitle1 +'' from ['+@表名+'] pivot ( max([''+name+'']) for ['+@哪字段转行+'] in (''+@sTitle2+'')) a''+char(10)     '+char(10) 
	SET @sql=@sql+ 'FROM syscolumns WHERE  ID=object_id('''+@表名+''') AND name<>'''+@哪字段转行+'''     '+char(10) 
	SET @sql=@sql+char(10)

	--生成列转行sql语句
	SET @sql=@sql+ 'Set @sql2=''''           '+char(10)
	SET @sql=@sql+ 'Set @sql2=@sql2+''  select ['+ @列转行后字段名+'],''+@sTitle3+''  from( ''+char(10)+''   ''           '+char(10)
	SET @sql=@sql+ 'Set @sql2=@sql2+@sTab                 '+char(10)
	SET @sql=@sql+ 'Set @sql2=@sql2+''  ) AS d GROUP BY ['+@列转行后字段名+']       ''           '+char(10)

	--执行sql2脚本
	SET @sql=@sql+ 'exec(@sql2)'  
	 
	--显示sql2脚本
	--SET @sql=@sql+ 'print @sql2' 
	--显示sql脚本
	--print @sql

	exec(@sql)
-------------------------------------------------------------------------------------------
END





------------------------------------原形-------------------------------------
  --DECLARE @sTitle VARCHAR(8000),@sTitle2 VARCHAR(8000),@sTitle3 VARCHAR(8000),@sTab VARCHAR(8000),@sql2 VARCHAR(8000)    
  --SELECT  
		--@sTitle  =ISNULL(@sTitle+',','')+ 姓名,      
		--@sTitle2 =ISNULL(@sTitle2+',','')+'"'+姓名+'"',     
		--@sTitle3 =ISNULL(@sTitle3+',','')+' max('+姓名+') as ' + 姓名     
  --FROM  tba

  --SELECT    
  --@sTab=ISNULL(@sTab+' UNION ','')+'select '''+name+''' AS 学科,'+ @sTitle +' from tba pivot ( max('+name+') for 姓名 in ('+@sTitle2+')) a'+char(10)     
  --FROM syscolumns WHERE  ID=object_id('tba') AND name<>'姓名'     

  --select 学科, max(张三) as 张三, max(李四) as 李四  from( 
  --      select '语文' AS 学科,张三,李四 from tba pivot ( max(语文) for 姓名 in ("张三","李四")) a
  --      UNION select '数学' AS 学科,张三,李四 from tba pivot ( max(数学) for 姓名 in ("张三","李四")) a
  --      UNION select '物理' AS 学科,张三,李四 from tba pivot ( max(物理) for 姓名 in ("张三","李四")) a
  --) AS d GROUP BY 学科       
  
--------------------------------------------------------------------------------------------



 

 在sql server 2005下测试通过,pivot需要sql server2005以上版本支持

---------------------------------调用方法------------------------------------

EXEC dbo.TableColToRow
    @表名 = 'tba', -- varchar(80)
    @哪字段转行 = '姓名', -- varchar(80)
    @列转行后字段名 = '学科' -- varchar(80)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值