本文主要是介绍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)
这篇关于SQL Server 列转行存储过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!