SQL Server里那些我们应该知道的系统存储过程
Posted ShenLiang2025
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server里那些我们应该知道的系统存储过程相关的知识,希望对你有一定的参考价值。
SQL Server常见系统存储过程
1 sp_who
功能及说明:
当前数据库实例的用户、会话、进程信息。
参数主要包括用户(@loginame='xxxx')、会话状态(仅活动的即ACTIVE)、回话ID三个参数里的一个。如果不加参数则返回该数据库实例下的所有会话信息。
返回参数:主要有会话ID、执行计划上下文ID、状态、登录名、主机名、阻塞进程对应的会话ID、数据库名、命令(TSQL、SQL、数据库内部命令代号)、请求ID。
示例:
-- 1 不传参数
sp_who
--EXEC sp_who 等价于上式
--2仅传登录名参数
--EXEC sp_who @loginame='sa';
EXEC sp_who 'sa'; --等价于上式
--3仅传状态参数
EXEC sp_who 'active';
--4仅传spid参数
exec sp_who 55
2 sp_helptext
功能及说明:返回用户定义的规则、默认值的定义、未加密的用户自定义存储过程(函数)、触发器、计算列、检查(CHECK)约束、视图、系统对象(系统存储过程)的代码文本定义。
示例:
--1查看存储过程的代码定义
sp_helptext @objname ='usp_useradd_MS'
--2查看函数的代码定义
sp_helptext @objname ='fun_GetPage'
--3 查看计算列的定义
USE AdventureWorks2019;
GO
sp_helptext @objname = N'AdventureWorks2019.Sales.SalesOrderHeader', @columnname = TotalDue ;
GO
-- 4 查看系统存储过程sp_who的代码定义
sp_helptext @objname = N'sp_who';
3 sp_help
功能及说明:显示指定数据库对象里的详细信息(对象类型、创建时间、字段类型、是否自增、文件组等信息)。
其它类似的系统存储过程有:
sp_helptrigger(触发器详情)、sp_helpindex(索引详情)、sp_helpserver(服务器详情)、sp_helpstats(统计信息详情)、
sp_helpsort(字符集排序详情)、 sp_helpfilegroup(文件组详情)、sp_helplanguage(语言详情)、sp_helpfile(数据库文件详情)、sp_helpdb(数据库详情)等。
详见使用结尾处示例代码。
示例:
sp_help 'tb_user'
-- 2其它help类系统存储过程
USE AdventureWorks2019
GO
--查看指定表的触发器信息
EXEC sp_helptrigger 'Person.Person';
--查看指定表的索引信息
EXEC sp_helpindex N'Sales.Customer';
--查看数据库所在实例的服务器信息
EXEC sp_helpserver N'localhost';
--查看指定表的统计信息
EXEC sp_createstats;
GO
EXEC sp_helpstats
@objname = 'Sales.Customer',
@results = 'ALL';
--查看当前数据库字符集排序
sp_helpsort;
--查看数据库文件组信息
sp_helpfilegroup 'PRIMARY'
--查看某国语言的格式信息(日期格式、周首日序号、月格式等)
sp_helplanguage 'Simplified Chinese' ;
sp_helplanguage
--查看数据文件和日志的详细信息。
sp_helpfile;
--查看表对应的约束信息(主键、外键、检查约束、默认值约束等)
EXEC sp_helpconstraint 'Production.Product';
--查看数据库的信息(数据库名、大小、所有者、创建时间、数据库状态、兼容级别)
EXEC sp_helpdb
4 sp_depends
功能及说明:
显示数据库对象的依赖信息,比如视图或存储过程里依赖的表或视图或者反过来。
示例:
sp_depends @objname = N'tb_user'
--查看触发器里依赖的表、视图等数据库对象
USE AdventureWorks2019
GO
EXEC sp_depends @objname = N'Production.iWorkOrder' ;
5 sp_detach_db sp_attach_db
功能及说明:
sp_detach_db是对数据库进行分离(卸载),以下几种情况不能分离:
1 数据库正在用时
2 数据库处理复制状态
3 数据库的快照已存在
4数据库正在被镜像
5 数据库已经被挂起
6 当前数据库是系统数据库
示例:
USE master;
ALTER DATABASE AdventureWorks2012
SET SINGLE_USER;
GO
EXEC sp_detach_db 'AdventureWorks2019', 'true';
2 与之对应的是通过sp_attach_db命令完成数据的附加(装载)
示例:
EXEC sp_attach_db @dbname = N'AdventureWorks2019',
@filename1=N'C:\\Program Files\\Microsoft SQL Server\\MSSQL13.MSSQLSERVER\\MSSQL\\Data\\AdventureWorks2019_Data.mdf',
@filename2=N'C:\\Program Files\\Microsoft SQL Server\\MSSQL13.MSSQLSERVER\\MSSQL\\Data\\AdventureWorks2019_log.ldf';
6 sp_spaceused
功能及说明: 查看当前数据库、数据库对象的空间使用情况
示例:
sp_spaceused
sp_spaceused 'tb_user'
7 sp_renamedb
功能及说明:对某个数据库重命名
示例:
USE master;
GO
CREATE DATABASE Accounting;
GO
SELECT * FROM sys.databases WHERE name ='Accounting'
EXEC sp_renamedb N'Accounting', N'Financial';
GO
SELECT * FROM sys.databases WHERE name =N'Financial'
8 sp_rename
功能及说明:重命名某个数据库对象(表、字段、索引、约束、统计信息等)
示例:
--1重命名表名
USE AdventureWorks2019;
GO
EXEC sp_rename 'Sales.SalesTerritory', 'SalesTerr';
GO
--2重命名字段
USE AdventureWorks2019;
GO
EXEC sp_rename 'Sales.SalesTerritory.TerritoryID', 'TerrID', 'COLUMN';
GO
--3重命名索引
USE AdventureWorks2019;
GO
EXEC sp_rename N'Purchasing.ProductVendor.IX_ProductVendor_VendorID', N'IX_VendorID', N'INDEX';
GO
9 sp_executesql
功能及说明:执行动态SQL。
示例
SET @IntDeptno = 30;
SET @SQLString = N'SELECT @max_salOUT = max(sal)
FROM employee
WHERE deptno = @dno';
SET @ParmDefinition = N'@dno TINYINT, @max_salOUT decimal(7,2) OUTPUT';
EXECUTE sp_executesql @SQLString, @ParmDefinition, @dno = @IntDeptno, @max_salOUT=@max_sal OUTPUT;
SELECT @max_sal;
上述代码翻译过来是:
SELECT max(sal) FROM employee
WHERE deptno=30
10 sp_configure
功能及说明:进行系统配置。
示例:
-- 启用Ad Hoc Distributed Queries:
exec sp_configure 'show advanced options',1
reconfigure
exec sp_configure 'Ad Hoc Distributed Queries',1
reconfigure
--使用完成后,再关闭Ad Hoc Distributed Queries选项
exec sp_configure 'Ad Hoc Distributed Queries',0
reconfigure
exec sp_configure 'show advanced options',0
reconfigure
11 sp_adduser
功能及说明:给当前数据库加个用户
参数形式为:
sp_adduser [ @loginame = ] 'login'
[ , [ @name_in_db = ] 'user' ]
[ , [ @grpname = ] 'role' ]
示例:
-- 1 将登录名是Vidur的用户Vidur添加到组Recruiting内
EXEC sp_adduser 'Vidur', 'Vidur', 'Recruiting';
-- 2 增加一个和登录名一样的用户Arvind
EXEC sp_adduser 'Arvind';
12 sp_addlogin
功能及说明:创建一个可以连入SQL Server数据库的登录名。
参数形式为:
sp_addlogin [ @loginame = ] 'login'
[ , [ @passwd = ] 'password' ]
[ , [ @defdb = ] 'database' ]
[ , [ @deflanguage = ] 'language' ]
[ , [ @sid = ] sid ]
[ , [ @encryptopt = ] 'encryption_option' ]
[;]
示例:
-- 创建一个登录名并制定密码和默认所属数据库corporate。
EXEC sp_addlogin 'Albert', 'B5432-3M6', 'corporate';
GO
13 sp_password
功能及说明:修改SQL Server登录名的密码。
--1修改用户John的密码为新密码,这里无需知道旧密码
ALTER LOGIN John WITH PASSWORD = 'G368630s#2_36';
GO
--2修改用户John的密码为新密码,这里需输入旧密码
ALTER LOGIN John WITH PASSWORD = 'G368630s#2_36' OLD_PASSWORD = 'H3q1jhygd#2_23236'; GO
14 sp_droplogin sp_dropuser
功能及说明:删除登录名、用户名。
示例:
-- 删除登录名John
EXEC sp_droplogin 'John';
GO
-- 删除用户名Albert
EXEC sp_dropuser 'Albert';
GO
15 sp_table_privileges
功能及说明:SQL Server查看表的权限。
示例:
EXEC sp_table_privileges 'tb_user';
16 sp_tables
功能及说明:SQL Server查看数据库下的所有用户下的表(含sys用户)。
示例:
--1查看当前数据库下所有用户下的表信息。
EXEC sp_tables
--2查看当前数据库下dbo模式下以emp开头的表信息。
EXEC sp_tables
@table_name = 'emp%',
@table_owner = 'dbo'
17 sp_stored_procedures
功能及说明:SQL Server查看当前数据库内所有用户下的存储过程(含sys用户)。
示例:
EXEC sp_stored_procedures
18 sp_columns
功能及说明:查看当前数据库内指定表的字段信息 (含sys用户)。
示例:
EXEC sp_columns 'tb_user'
19 sp_databases
功能及说明:查看所有数据库的信息(名称、数据库大小)。
示例:
EXEC sp_databases
20 sp_column_privileges
功能及说明:查看当前数据库里查看指定表的字段权限(INSERTREFERENCES、SELECT、UPDATE)。
参数形式
sp_column_privileges [ @table_name = ] 'table_name'
[ , [ @table_owner = ] 'table_owner' ]
[ , [ @table_qualifier = ] 'table_qualifier' ]
[ , [ @column_name = ] 'column' ]
示例:
USE AdventureWorks2019;
GO
EXEC sp_column_privileges @table_name = 'Employee'
,@table_owner = 'HumanResources'
,@table_qualifier = 'AdventureWorks2019'
,@column_name = 'SalariedFlag';
21 sp_MSforeachdb sp_MSforeachtable
sp_MSforeachd、sp_MSforeachtable是两个未公开的系统存储过程,前者用于遍历所有数据库,后者用于遍历某个数据库下所有表。
示例:
--1遍历当前数据库里每个表执行sp_spaceused
exec sp_MSforeachtable @command1="sp_spaceused '?'"
-- 2结合临时表查看所有数据库下的模式
CREATE TABLE #schemaTable(
dbname VARCHAR(100),
schemaname VARCHAR(100)
)
EXEC sp_MSforeachdb @command1="print '?'",
@command2="INSERT INTO #schemaTable SELECT '?',name schemas_name FROM sys.schemas"
SELECT * FROM #schemaTable
以上是关于SQL Server里那些我们应该知道的系统存储过程的主要内容,如果未能解决你的问题,请参考以下文章
如何自动导出 SQL Server 2008 版本的存储过程