欢迎来到飞鸟慕鱼博客,开始您的技术之旅!
当前位置: 首页知识笔记正文

SQL Server中两个有用的存储过程

墨初 知识笔记 82阅读

好几天没看博客了,有必要放点东西进去。因为有点懵懂所以不知道写什么,现在想到什么就写什么。虽然有些是老生常谈,但我还是会补充一些自己的看法。这次我就说说SQL Server中的sp_MSforeachtable和sp_MSforeachdb。这两个存储过程在联机丛书中。' font: minor-latin '里面什么都没有,其实有很多东西是网上没有的,但是比甲骨文好。毕竟甲骨文什么都没有,文档里也能看出来人疯了)。平时我们可能不需要他们,但有时候他们能帮我们很多。首先看sp _ msforeachtable(sp _ msforeachdb与之类似)。它用于遍历数据库中的表,并支持以下七个参数:@command1。

an>:要执行的第一个命令
@replacechar:占位符,默认值为问号(?)
@command2:要执行的第二个命令
@command3:要执行的第三个命令
@whereandWhere条件 Order By字句(不要“以貌取人”也差不多就是这个意思了)
@precommand 执行整个循环之前所要执行的命令(只执行一次)
@postcommand:执行整个循环之后所要执行的命令(只执行一次

其中,只有第一个参数是必须的,其余都是选填的。

看几个例子

1.       基本型

1 sp_MSforeachtable 
2    @command1 = 'SELECT COUNT(*) AS ''?'' FROM ?'

这个例子很简单,就是对当前数据库的每个表计数。实际上你可以做点实际的,比如DBCC之类的(特别是数据库优化的时候,非常有用,当然,2005中还有别的办法,这个以后再说)。

运行结果如下所示:



2.       占位符型

1 sp_MSforeachtable 
2    @command1 = 'SELECT COUNT(*)AS ''#'' FROM #'
3    @replacechar = '#'

当你的语句中需要用到默认的问号,或者你不喜欢问号时,就可以换个别的(这好像用处不是很大)。

运行结果跟上面的一样,就不多说了

3.       多语句型

1 sp_MSforeachtable 
2    @command1 = 'PRINT ''?'''
3    @command2 = 'SELECT COUNT(*) FROM ?'

当你需要对各个表执行多个操作时,就可以用这个了。

不过,这里的运行结果比较无聊。但是,你可以将输出设置为文本型的,这样就有用了,比如在写什么报告的时候就很方便。

看看文本形式的运行结果。



这样,就可以直接复制到你的报告中去了。当然也可以直接输出为文本文件,看你的需要吧。此外,还可以直接输出为
Excel文件,不过需要稍微做些手脚,这里就不多说了,以后再谈。

4.       筛选与排序

1 sp_MSforeachtable 
2    @command1 = 'PRINT ''?'''
3    @command2 = 'SELECT COUNT(*) FROM ?'
4    @whereand = 'ORDER BY 1'

@whereand参数,从名字上来看是Where子句,实际上也是可以放Order By的。当然,你也可以依此类推,在这里放置任何在语法上位于Where子句后面的字句都是可以的。我们用了ORDER BY 1,个人感觉不是很好的习惯,不过在这里倒是很方便实用的,在实际的编程中,建议最好别这样用。

看看运行结果,各表按名称排序了。

 

5.       开始与结束

刚才已经说了,如果是为了某个报告的话,可以加写点缀。那么你还可以加点其他的东西来润色一下。比如这样:

1 sp_MSforeachtable 
2    @command1 = 'PRINT ''?'''
3    @command2 = 'SELECT COUNT(*) FROM ?'
4    @whereand = 'ORDER BY 1'
5    @precommand = 'PRINT ''START ON '' + CAST(GETDATE() AS VARCHAR)'
6    @postcommand = 'PRINT ''Game Over!'''

看看运行结果



这样,放到报告中,似乎就好看多了。

 

本来打算再说说sp_MSforeachdb的,不过这个存储过程跟sp_MSforeachtable差不多,只是它针对的是数据库罢了,而且大家平时估计也就是操作一个数据库而已,所以就简单说说就是了。参数少了一个,即没有了@whereand

 

好了,这么多年以来,终于第一次写了一个看上去还行的Blog,以后继续努力了。

 

标签:
声明:无特别说明,转载请标明本文来源!