如果查询可以排除系统存储过程,那将更加有用。
#1 楼
正如Mike所说,最好的方法是使用information_schema
。只要您不在master数据库中,就不会返回系统存储过程。SELECT *
FROM DatabaseName.INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'PROCEDURE'
如果由于某种原因您在非数据库存储过程中主数据库中,您可以使用查询(这将过滤掉MOST系统存储过程):
SELECT *
FROM [master].INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'PROCEDURE'
AND LEFT(ROUTINE_NAME, 3) NOT IN ('sp_', 'xp_', 'ms_')
#2 楼
SELECT name,
type
FROM dbo.sysobjects
WHERE (type = 'P')
评论
在MS-SQL 2008的共享环境中,这对我有用。前两个没有...
– Realto619
2014年11月25日16:49
使用SQL Server 2005或更高版本的任何人都应远离dbo.sys *视图。此查询还:筛选出CLR存储过程,不筛选出系统存储的proc,并在已知[type]始终为'P'时返回[type],因为它是WHERE条件。
–所罗门·鲁兹基
2015年1月8日15:25
如果数据库中的对象具有不同的架构,它将不起作用
–Foyzul Karim
18年7月15日在11:56
#3 楼
据我了解,“首选”方法是使用information_schema表:select *
from information_schema.routines
where routine_type = 'PROCEDURE'
评论
返回的记录似乎没有办法区分系统存储过程
–尼克·贝拉迪(Nick Berardi)
08-10-20在18:57
#4 楼
以下将返回所选数据库中的所有过程SELECT * FROM sys.procedures
评论
这已经修改并创建日期,等等。这非常有用
–ihightower
17年4月19日在8:54
#5 楼
您可以尝试使用以下查询来获取存储过程和函数:SELECT name, type
FROM dbo.sysobjects
WHERE type IN (
'P', -- stored procedures
'FN', -- scalar functions
'IF', -- inline table-valued functions
'TF' -- table-valued functions
)
ORDER BY type, name
#6 楼
如果使用的是SQL Server 2005,则可以使用以下功能:select *
from sys.procedures
where is_ms_shipped = 0
评论
这将产生错误的结果,并在sql 2008中包括类似于图的存储过程(sp_upgraddiagrams)
– HaveNoDisplayName
2015年1月8日14:25
@Piyush确实会返回图表过程,但有人可能不认为它们是“系统”过程,因为它们不是标准安装所附带的。 O.P.没有指定处理方式,因此未将其过滤掉不一定是错误的。
–所罗门·鲁兹基
2015年1月8日在16:07
@srutzky:-但是这些不是用户创建的sp
– HaveNoDisplayName
2015年1月8日在16:09
@Piyush True,但是正如我说的,O.P。没有指定如何处理既不是“用户创建的”也不是“系统”的proc。没有人问过。
–所罗门·鲁兹基
15年1月8日在16:11
好答案。感谢您包含“ is_ms_shipped = 0”。
–汉斯·冯(Hans Vonn)
17年6月16日14:57
#7 楼
您可以使用以下查询之一在一个数据库中查找存储过程的列表:Query1:
SELECT
*
FROM sys.procedures;
Query2:
SELECT
*
FROM information_schema.routines
WHERE ROUTINE_TYPE = 'PROCEDURE'
如果要查找所有数据库中所有SP的列表,可以使用以下查询:
CREATE TABLE #ListOfSPs
(
DBName varchar(100),
[OBJECT_ID] INT,
SPName varchar(100)
)
EXEC sp_msforeachdb 'USE [?]; INSERT INTO #ListOfSPs Select ''?'', Object_Id, Name FROM sys.procedures'
SELECT
*
FROM #ListOfSPs
评论
IMO您使用sp_msforeachdb的示例是黄金,应该是答案。这是我发现谈论此存储过程的更多链接:weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx
– Mike Cheel
17年5月10日在16:26
#8 楼
选择所有存储的过程和视图select name,type,type_desc
from sys.objects
where type in ('V','P')
order by name,type
#9 楼
这也可以帮助列出除系统过程以外的过程:select * from sys.all_objects where type='p' and is_ms_shipped=0
评论
由于要对is_ms_shipped = 0进行过滤,因此没有理由使用sys.all_objects。它可以包含DDL触发器,但是那些触发器将被type ='p'过滤掉。您不妨使用sys.objects。
–所罗门·鲁兹基
2015年1月8日在15:54
#10 楼
不幸的是,INFORMATION_SCHEMA
不包含有关系统进程的信息。SELECT *
FROM sys.objects
WHERE objectproperty(object_id, N'IsMSShipped') = 0
AND objectproperty(object_id, N'IsProcedure') = 1
评论
为什么要用它代替is.ms_shipped = 0的sys.procedures?当存在包含该值的is_ms_shipped字段时,为什么还要为每行运行一个函数objectproperty(object_id,N'IsMSShipped')?同样,当[type] IN(“ P”,“ PC”)执行相同的操作时,为什么还要再次运行该功能?该方法不必要地复杂且效率低下。
–所罗门·鲁兹基
2015年1月8日在16:03
#11 楼
只是名字:SELECT SPECIFIC_NAME
FROM YOUR_DB_NAME.information_schema.routines
WHERE routine_type = 'PROCEDURE'
#12 楼
我已经对LostCajun的出色帖子进行了调整,以排除系统存储过程。我还删除了“提取”。从代码中删除,因为我无法弄清楚它的用途,并且给了我错误。循环内的“获取下一个”语句还需要一个“ into”子句。use <<databasename>>
go
declare @aQuery nvarchar(1024);
declare @spName nvarchar(64);
declare allSP cursor for
select p.name
from sys.procedures p
where p.type_desc = 'SQL_STORED_PROCEDURE'
and LEFT(p.name,3) NOT IN ('sp_','xp_','ms_')
order by p.name;
open allSP;
fetch next from allSP into @spName;
while (@@FETCH_STATUS = 0)
begin
set @aQuery = 'sp_helptext [' + @spName + ']';
exec sp_executesql @aQuery;
fetch next from allSP into @spName;
end;
close allSP;
deallocate allSP;
#13 楼
获取对象的最佳方法是使用sys.sql_modules。您可以从此表中找到所需的所有内容,并将此表与其他表结合以通过object_idSELECT o. object_id,o.name AS name,o.type_desc,m.definition,schemas.name scheamaName
FROM sys.sql_modules m
INNER JOIN sys.objects o ON m.object_id=o.OBJECT_ID
INNER JOIN sys.schemas ON schemas.schema_id = o.schema_id
WHERE [TYPE]='p'
获得更多信息。
#14 楼
select *
from dbo.sysobjects
where xtype = 'P'
and status > 0
评论
status> 0似乎无法区分系统存储过程和创建的存储过程
–垫子
08-10-20在18:56
嗯它对我们有用-我不知道为什么。
–鲍勃·普罗布斯特(Bob Probst)
08-10-20在19:02
使用SQL Server 2005或更高版本的任何人都应远离dbo.sys *视图。该查询还会过滤掉CLR存储过程。
–所罗门·鲁兹基
15年1月8日在15:29
#15 楼
我写了这个简单的tsql来列出所有存储过程的文本。确保在字段中替换您的数据库名称。use << database name >>
go
declare @aQuery nvarchar(1024);
declare @spName nvarchar(64);
declare allSP cursor for
select p.name from sys.procedures p where p.type_desc = 'SQL_STORED_PROCEDURE' order by p.name;
open allSP;
fetch next from allSP into @spName;
while (@@FETCH_STATUS = 0)
begin
set @aQuery = 'sp_helptext [Extract.' + @spName + ']';
exec sp_executesql @aQuery;
fetch next from allSP;
end;
close allSP;
deallocate allSP;
评论
请参阅@BaffledBill对它的重写。这个没有用,因为它有很多错误。
–ihightower
17年4月19日在9:00
#16 楼
这将只给出存储过程的名称。select specific_name
from information_schema.routines
where routine_type = 'PROCEDURE';
#17 楼
这将显示所有存储过程和代码:select sch.name As [Schema], obj.name AS [Stored Procedure], code.definition AS [Code] from sys.objects as obj
join sys.sql_modules as code on code.object_id = obj.object_id
join sys.schemas as sch on sch.schema_id = obj.schema_id
where obj.type = 'P'
#18 楼
这列出了您想要的所有内容在Sql Server 2005、2008、2012中:
Use [YourDataBase]
EXEC sp_tables @table_type = "'PROCEDURE'"
EXEC sp_tables @table_type = "'TABLE'"
EXEC sp_tables @table_type = "'VIEW'"
OR
SELECT * FROM information_schema.tables
SELECT * FROM information_schema.VIEWS
评论
没有理由使用sp_tables或从中受益。另外,“ PROCEDURE”对于sp_tables也不有效。 @table_type的唯一选项是:“ SYSTEM TABLE”,“ TABLE”和“ VIEW”。
–所罗门·鲁兹基
2015年1月8日15:42
#19 楼
这将返回所有sp名称Select *
FROM sys.procedures where [type] = 'P'
AND is_ms_shipped = 0
AND [name] not like 'sp[_]%diagram%'
评论
[type]上的条件应为[type] IN(“ P”,“ PC”),否则您将过滤掉可能存在的任何CLR存储过程。
–所罗门·鲁兹基
2015年1月8日在16:09
#20 楼
尝试使用此Codeplex链接,此实用程序有助于从sql数据库本地化所有存储过程。https://exportmssqlproc.codeplex.com/
#21 楼
select * from DatabaseName.INFORMATION_SCHEMA.ROUTINES where routine_type = 'PROCEDURE'
select * from DatabaseName.INFORMATION_SCHEMA.ROUTINES where routine_type ='procedure' and left(ROUTINE_NAME,3) not in('sp_', 'xp_', 'ms_')
SELECT name, type FROM dbo.sysobjects
WHERE (type = 'P')
#22 楼
USE DBNAME
select ROUTINE_NAME from information_schema.routines
where routine_type = 'PROCEDURE'
GO
这将在mssql上起作用。
#23 楼
选择SQL Server中的存储过程列表。请参阅此处以了解更多信息:https://coderrooms.blogspot.com/2017/06/select-list-of-stored-procedure-in-sql.html
评论
你好,欢迎光临。该代码似乎没有按照标题中的说明执行。它似乎只是创建一个存储过程,该存储过程从PaymentDetails表返回记录列表。 OP需要一个实际存储过程的列表。
–杰里米·卡尼(Jeremy Caney)
20年4月1日在19:02
评论
如果创建数据库图,则可能会在数据库中获得许多以“ dt_”开头的proc,您也可以将其过滤掉。
–约翰·富希(John Fouhy)
13年6月12日,0:16
+1用于信息模式。值得一读:msdn.microsoft.com/en-us/library/ms186778.aspx
– Shiham
2014-09-16 8:34
它应该是“只要您不在[master]或[msdb]数据库中,...”
–所罗门·鲁兹基
15年1月8日在15:18