首页 新闻 赞助 找找看

求教,SQL server存储过程该怎么理解。

0
悬赏园豆:50 [已解决问题] 解决于 2014-12-04 16:18

希望路过的高手指点迷津,新手表示看不懂。

在书上看到一个SQL实现动态交叉表的例子,可是里面的存储过程看不懂,请问这该怎么理解以下的代码:

CREATE procedure proc_across_table
@TableName as varchar(50), --生成交叉表依据的表名
@NewColumn as varchar(50), --生成表头依据的字段名
@GroupColumn as varchar(50), --分组依据的字段名
@StatColumn as varchar(50), --欲统计的字段名
@Operator as varchar(10) --统计的运算方式
AS
DECLARE @SQL as varchar(1000), @Column as varchar(50) --定义参数
EXECUTE ('DECLARE cursor_new_column CURSOR FOR SELECT DISTINCT ' + @NewColumn + ' from ' + @TableName + ' for read only ') --定义游标
begin
SET nocount ON
SET @SQL='select ' + @GroupColumn + ', ' + @Operator + '(' + @StatColumn + ') AS [' + @Operator + ' of ' + @StatColumn + ']' --定义SQL语句头
OPEN cursor_new_column
while (0=0)
BEGIN --遍历游标
FETCH NEXT FROM cursor_new_column INTO @Column --通过游标获取列头信息
if (@@fetch_status<>0) break
SET @SQL = @SQL + ', ' + @Operator + '(CASE ' + @NewColumn + ' WHEN ''' + @Column + ''' THEN ' + @StatColumn + ' ELSE Null END) AS [' + @Column + ']' --循环追加SQL语句
END
SET @SQL = @SQL + ' from ' + @TableName + ' group by ' + @GroupColumn --定义SQL语句尾
EXECUTE(@SQL) --执行SQL语句
PRINT @SQL --输出SQL语句
IF @@error <>0 RETURN @@error --如果出错,则返回错误代码
CLOSE cursor_new_column --关闭游标
DEALLOCATE cursor_new_column RETURN 0 --释放游标,释放成功则返回0
end
GO
一片云123的主页 一片云123 | 初学一级 | 园豆:116
提问于:2014-11-25 15:38
< >
分享
最佳答案
0

你直接看输出的@SQL的值就行了。大概就是通过游标加case when 来实现行列转换...

收获园豆:10
幻天芒 | 高人七级 |园豆:37175 | 2014-11-25 15:42

怎么查看@sql的值呢?

一片云123 | 园豆:116 (初学一级) | 2014-11-25 15:53

@一片云123: 执行这个存储过程就看到了。倒数第6行就是输出这个sql

幻天芒 | 园豆:37175 (高人七级) | 2014-11-25 16:05
其他回答(4)
0

这些SQL脚本其实就像程序里代码类似,拼接SQL语句,遍历游标就是循环,在存储过程末尾添加print(),你已经有了,或者你 select @sql ,拿出来慢慢赏析。

收获园豆:10
KingMi | 园豆:1344 (小虾三级) | 2014-11-25 16:10
0

SET @SQL = @SQL + ' from ' + @TableName + ' group by ' + @GroupColumn --定义SQL语句尾

-----这儿加一句

Select @SQL

---就会把@SQL显示出来了。

EXECUTE(@SQL) --执行SQL语句

收获园豆:10
爱编程的大叔 | 园豆:30839 (高人七级) | 2014-11-25 16:23
0

你执行一下sql,你先看一下效果,然后按照代码的注释一遍一遍看看。注释写的很清楚啊!

收获园豆:10
Mr.Brian | 园豆:1518 (小虾三级) | 2014-11-25 16:28
0

开始学习的时候,书上肯定有由浅到深的东西..我一开始和你一样,都想全弄懂,这样这本书看一遍就算完了.

 

后来发现书上的好多东西,平时工作中只用到一些基本的..高深的不是很常用,可以等着以后必须用的时候才来学.

这样不耽误学习进度,也不打击学习的信心.而且学了就能用上..不太懂的先放一放.

收获园豆:10
hexllo | 园豆:318 (菜鸟二级) | 2014-11-27 18:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册