sqlserver作为企业级关系型数据库,内置了大量实用的存储过程,熟练掌握这些存储过程可以帮助开发者快速完成各类数据库操作,减少重复编码工作。本文整理了日常开发和维护中最常用的sqlserver存储过程,附带具体使用场景和示例代码。
系统信息查询类存储过程
sp_help
该存储过程用于查看数据库对象的基本信息,包括表、视图、存储过程等的结构、字段、索引等详情,是了解对象属性的首选工具。
-- 查看指定表的结构信息 EXEC sp_help 'user_info'; -- 查看存储过程的定义信息 EXEC sp_help 'proc_get_user_list';
sp_databases
用于列出当前sqlserver实例中所有可访问的数据库信息,包括数据库名称、大小、状态等。
-- 查询所有数据库列表 EXEC sp_databases;
表与索引管理类存储过程
sp_rename
用于修改数据库对象的名称,支持修改表名、列名、索引名、存储过程名等,修改时需要注意依赖对象的适配。
-- 修改表名 EXEC sp_rename 'old_user_table', 'new_user_table'; -- 修改表的列名 EXEC sp_rename 'user_info.old_column', 'new_column', 'COLUMN';
sp_helpindex
专门用于查看指定表上的所有索引信息,包括索引名称、类型、包含的字段、是否唯一等属性。
-- 查看user_info表的所有索引 EXEC sp_helpindex 'user_info';
性能监控类存储过程
sp_who
用于查看当前sqlserver实例中的用户进程和会话信息,包括会话ID、登录用户、数据库、执行状态、阻塞情况等,是排查阻塞问题的常用工具。
-- 查看所有当前会话 EXEC sp_who; -- 查看指定用户的会话 EXEC sp_who 'sa';
sp_lock
用于查看当前数据库中的锁信息,包括锁定的资源、锁类型、持有锁的会话ID等,配合sp_who可以快速定位死锁和阻塞源头。
-- 查看所有锁信息 EXEC sp_lock; -- 查看指定会话ID的锁信息 EXEC sp_lock 52;
数据操作辅助类存储过程
sp_executesql
用于执行动态拼接的sql语句,支持参数化查询,相比直接拼接字符串执行,能有效避免sql注入问题,同时提升执行计划复用率。
-- 参数化查询示例 DECLARE @sql NVARCHAR(1000); DECLARE @user_id INT = 10; SET @sql = N'SELECT * FROM user_info WHERE id = @id'; EXEC sp_executesql @sql, N'@id INT', @id = @user_id;
sp_spaceused
用于查看数据库或指定表的存储空间使用情况,包括数据大小、索引大小、未使用空间等,方便做存储容量规划。
-- 查看当前数据库的空间使用情况 EXEC sp_spaceused; -- 查看指定表的空间使用情况 EXEC sp_spaceused 'user_info';
使用存储过程的注意事项
- 部分系统存储过程以sp_开头,自定义存储过程建议避免使用该前缀,防止和系统存储过程名称冲突。
- 执行修改类存储过程如sp_rename前,建议先备份相关数据,避免误操作导致数据丢失。
- 动态sql执行时优先使用sp_executesql而非直接EXEC拼接字符串,保障代码安全性。
- 不同版本的sqlserver可能存在部分存储过程功能差异,使用前建议确认当前版本的支持情况。