小爱,帮我看看这存储过程,调好了,分都给你....

飘零一叶 2011-01-12 11:00:56
IF OBJECT_ID('USP_PIVOT') IS NOT NULL DROP PROCEDURE USP_PIVOT
GO
---SELECT * FROM TB PIVOT(MAX(COL1) FOR COL2 IN( , , , , , , ))
CREATE PROCEDURE USP_PIVOT
@schema_name AS SYSNAME =N'dbo' --架构名称
,@object_name AS SYSNAME =NULL --表/视图名称
,@on_row AS SYSNAME=NULL --分组列
,@on_cols AS SYSNAME=NULL --旋转列
,@agg_func AS NVARCHAR(10)=N'MAX' --聚合函数
,@agg_col AS SYSNAME=NULL --统计列
AS
BEGIN
DECLARE @object AS NVARCHAR(600)
,@sql AS NVARCHAR(MAX)
,@cols AS NVARCHAR(MAX)
,@newline AS NVARCHAR(2)
,@msg AS NVARCHAR(500);

--检查是否缺少输入
IF @schema_name IS NULL
OR @object_name IS NULL
OR @on_row IS NULL
OR @on_cols IS NULL
OR @agg_func IS NULL
OR @agg_col IS NULL
BEGIN
SET @msg=N'Missing input parameters:'
+CASE WHEN @schema_name IS NULL THEN N'@schema_name' ELSE '' END
+CASE WHEN @object_name IS NULL THEN N'@object_name' ELSE '' END
+CASE WHEN @on_row IS NULL THEN N'@on_row' ELSE '' END
+CASE WHEN @on_cols IS NULL THEN N'@on_cols' ELSE '' END
+CASE WHEN @agg_func IS NULL THEN N'@agg_func' ELSE '' END
+CASE WHEN @agg_col IS NULL THEN N'@agg_col' ELSE '' END
+'';
RAISERROR(@msg,16,1);
RETURN @msg;
END

SET @newline=NCHAR(13)+NCHAR(10);
SET @object=QUOTENAME(@schema_name)+'.'+QUOTENAME(@object_name);

--只允许在已存在的表或视图作为输入对象
IF COALESCE(OBJECT_ID(@object,N'U'),OBJECT_ID(@object,N'V')) IS NULL
BEGIN
SET @msg=N'%s is not a existing table or view in the database.';
RAISERROR(@msg,16,1,@object);
RETURN @msg;
END

--检查@on_row,@on_cols,@agg_col列名称是否存在
IF COLUMNPROPERTY(OBJECT_ID(@object),@on_row,'ColumnId') IS NULL OR
COLUMNPROPERTY(OBJECT_ID(@object),@on_cols,'ColumnId') IS NULL OR
COLUMNPROPERTY(OBJECT_ID(@object),@agg_col,'ColumnId') IS NULL
BEGIN
SET @msg=N'%s,%s and %S must a existing column in %s';
RAISERROR(@msg,16,1,@on_row,@on_cols,@agg_col,@object);
RETURN @msg;
END

--检查@agg_func是否是已存在聚合函数
IF @agg_func NOT IN(N'AVG',N'MAX',N'SUM',N'COUNT',N'COUNT_BIG',N'MIN',N'STDEV',N'STDEV',N'VAR',N'VARP')
BEGIN
SET @msg=N'%s is an unsupported aggregate function.';
RAISERROR(@msg,16,1,@agg_func);
RETURN @msg;
END

--构造列列表
--STUFF((SELECT '',''+on_cols FROM (SELECT DISTINCT '+QUOTENAME(@on_cols)+' AS [on_cols] FROM '+@object+') P FOR XML PATH(''''))),1,1,,'''')
SET @sql=N'SET @RESULT=' +@newline+
N' STUFF(' +@newline+
N' (SELECT N'',''+'
+N'QUOTENAME(on_cols) AS [TEXT()]' +@newline+
N' FROM (SELECT DISTINCT ('
+QUOTENAME(@on_cols)+N' AS [on_cols]' +@newline+
N' FROM '+@object+N') AS P' +@newline+
N' ORDER BY on_cols' +@newline+
N' FOR XML PATH('''')),' +@newline+
N' 1,1,N'''');'
EXEC sp_executesql @sql,N'@RESULT AS NVARCHAR(MAX) OUTPUT',@RESULT=@cols OUTPUT;
PRINT @cols

--创建PIVOT查询
SET @sql=N'SELECT *' +@newline+
N'FROM ' +@newline+
N'(SELECT ' +@newline+
N' '+QUOTENAME(@on_row)+N',' +@newline+
N' '+QUOTENAME(@on_cols)+N' AS pivot_col,'+@newline+
N' '+QUOTENAME(@agg_col)+N' AS agg_col' +@newline+
N' FROM '+@object +@newline+
N') AS PivotInput' +@newline+
N' PIVOT' +@newline+
N' ('+@agg_func+N'(agg_col)' +@newline+
N' FOR pivot_col' +@newline+
N' IN (' +@cols+ N')' +@newline+
N' ) AS P;';
EXEC @sql
END
GO
...全文
111 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
叶子 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 beirut 的回复:]
引用 10 楼 maco_wang 的回复:
小爱的可用分是不是显示的有问题?

神马问题?
[/Quote]
显示异常了
feixianxxx 2011-01-12
  • 打赏
  • 举报
回复
这个干吗用的?
散分?
黄_瓜 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 maco_wang 的回复:]
小爱的可用分是不是显示的有问题?
[/Quote]
神马问题?
叶子 2011-01-12
  • 打赏
  • 举报
回复
时间不早了,我要睡觉去了。
王向飞 2011-01-12
  • 打赏
  • 举报
回复
技术分享,学习。
叶子 2011-01-12
  • 打赏
  • 举报
回复
小爱的可用分是不是显示的有问题?
百年树人 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 beirut 的回复:]
引用 6 楼 maco_wang 的回复:
3分5分的催生,树哥就当无视了。
200分的技术贴,小爱可不敢要。

敢给我就敢要
[/Quote]

给的接的一起关!
黄_瓜 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 maco_wang 的回复:]
3分5分的催生,树哥就当无视了。
200分的技术贴,小爱可不敢要。
[/Quote]
敢给我就敢要
黄_瓜 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 dlut_liuq 的回复:]
SQL code
IF OBJECT_ID('USP_PIVOT') IS NOT NULL DROP PROCEDURE USP_PIVOT
GO
---SELECT * FROM TB PIVOT(MAX(COL1) FOR COL2 IN( , , , , , , ))
CREATE PROCEDURE USP_PIVOT
@schema_name AS SYSNAME =……
[/Quote]
不懂,帮顶,学习,蹭分
叶子 2011-01-12
  • 打赏
  • 举报
回复
3分5分的催生,树哥就当无视了。
200分的技术贴,小爱可不敢要。
飘零一叶 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 josy 的回复:]
这。。。 你们。。。
[/Quote]
树哥 帮我改改标题
我错了
黄_瓜 2011-01-12
  • 打赏
  • 举报
回复
不要无视树哥的存在

做人要低调
飘零一叶 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 josy 的回复:]
这。。。 你们。。。
[/Quote]
谁调好了,给谁
快溜 2011-01-12
  • 打赏
  • 举报
回复
不说了,给分。
百年树人 2011-01-12
  • 打赏
  • 举报
回复
这。。。 你们。。。

11,850

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 非技术版
社区管理员
  • 非技术版社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧