如何对SQL Server数据表和数据库进行迭代操作
本文介绍了master数据库中两个非常有用但在SQL Server在线教科书中没有提到的存储过程。
这些系统过程对于处理以下任务非常方便,如判断使用的存储空间大小、行数、用户表索引等等。第一个过程sp_MSForEachDB对于感兴趣的服务器上的每个数据库执行三条命令。
◆@command1:第一个执行的命令◆@replacechar:用另一个占位赋替换“?◆@command2:第二个执行的命令◆@command3:第三个执行的命令◆@precommand:进入循环前执行的命令◆@postcommand:循环结束后执行的命令
每个命令集(即使该集合只含有一条命令)作为一个批处理对每个数据库执行,所以当我们要将捕获的结果输出到文本而不是标准结果集表时,这将非常有用。
为了实现这一要求,选择菜单中的查询按钮|输出结果|输出到文本或者按快捷键[Ctrl]T。
下面的代码返回服务器上每个数据库中用户数据表的数目:
exec sp_MSForEachDB@command1 = "use ? exec sp_SpaceUsed"
The abbreviated output looks like this:简短输出可能如下:
数据库名数据库大小未分配空间大小
--------------------- ------------------ master 5.25 MB1.26 MB
reserved data index_size unused------------------ ------------------ 2808 KB 1144 KB 1080 KB 584 KB
第二个过程sp_MSForEachTable接受7个参数:
◆@command1:第一个执行的命令◆@replacechar:用另一个占位符替换“?◆@command2:第二个执行的命令◆@command3:第三个执行的命令◆@whereand:Where条件语句 (或 Order By 语句) ◆@precommand:进入循环前执行的命令 ◆@postcommand:循环结束后执行的命令
通过对要传递的参数命名,可以跳过传递空值的要求。当要执行的命令中含有一个问号时,参数@replacechar十分有用。@whereand参数的实现可以根据过滤器缩小输出的范围。
你还可以加入一个ORDER BY语句。下面的例子返回AdventureWorks数据库中每个数据表的行数,并按照数据表明对它们排序:
exec sp_MSForEachTable@command1 = "Print '?'", @command2 = "select count(*) from ?", @whereand = "ORDER BY 1"
下面是一些输出结果:
[HumanResources].[Department]-----------16
[HumanResources].[Employee]-----------290
[HumanResources].[EmployeeAddress]-----------290
[HumanResources].[EmployeeDepartmentHistory]-----------296
我喜欢通过模式和表名对数据表排序。
相关文章:
1. SQL Server 2008数据库引擎优化顾问与索引优化向导之间的差别2. sql server日期时间函数3. SQL Server 中Inner join 和where的效率差异4. sql server设置两个主键的方法5. Windows Vista下安装SQL Server 20056. 修改SQL Server2005数据库中的逻辑文件名7. VS连接SQL server数据库及实现基本CRUD操作8. SQL Server 2022 AlwaysOn新特性之包含可用性组详解9. SQL Server 2005 中能够使用 Try...Catch语句10. Windows系统彻底卸载SQL Server通用方法(推荐!)

网公网安备