Quelle requête peut renvoyer les noms de toutes les procédures stockées dans une base de données SQL Server
Si la requête pouvait exclure des procédures stockées système, ce serait encore plus utile.
Quelle requête peut renvoyer les noms de toutes les procédures stockées dans une base de données SQL Server
Si la requête pouvait exclure des procédures stockées système, ce serait encore plus utile.
Réponses:
Comme Mike l'a déclaré, la meilleure façon est de l'utiliser information_schema
. Tant que vous n'êtes pas dans la base de données master, les procédures stockées système ne seront pas retournées.
SELECT *
FROM DatabaseName.INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'PROCEDURE'
Si, pour une raison quelconque, vous aviez des procédures stockées non système dans la base de données master, vous pouvez utiliser la requête (cela filtrera la plupart des procédures stockées système):
SELECT *
FROM [master].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')
dbo.sys*
vues. Cette requête: filtre également les procédures stockées CLR, ne filtre pas les proc stockés par le système et renvoie [type] quand il est connu que [type] sera toujours 'P' car c'est la condition WHERE.
Les éléments suivants renvoient toutes les procédures dans la base de données sélectionnée
SELECT * FROM sys.procedures
Vous pouvez essayer cette requête pour obtenir des procédures et des fonctions stockées:
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
Si vous utilisez SQL Server 2005, les éléments suivants fonctionneront:
select *
from sys.procedures
where is_ms_shipped = 0
Vous pouvez utiliser l'une des requêtes ci-dessous pour trouver la liste des procédures stockées dans une base de données:
Requête1:
SELECT
*
FROM sys.procedures;
Requête2:
SELECT
*
FROM information_schema.routines
WHERE ROUTINE_TYPE = 'PROCEDURE'
Si vous souhaitez trouver la liste de tous les SP dans toutes les bases de données, vous pouvez utiliser la requête ci-dessous:
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
Sélectionner toutes les procédures et vues stockées
select name,type,type_desc
from sys.objects
where type in ('V','P')
order by name,type
Cela peut également aider à répertorier la procédure à l'exception des procédures système:
select * from sys.all_objects where type='p' and is_ms_shipped=0
sys.all_objects
puisque vous filtrez is_ms_shipped=0
. Il peut contenir des déclencheurs DDL, mais ceux-ci seront filtrés par type='p'
. Vous pourriez aussi bien utiliser sys.objects
.
Malheureusement, INFORMATION_SCHEMA
ne contient pas d'informations sur les procs du système.
SELECT *
FROM sys.objects
WHERE objectproperty(object_id, N'IsMSShipped') = 0
AND objectproperty(object_id, N'IsProcedure') = 1
sys.procedures where is_ms_shipped = 0
? Et pourquoi exécuter une fonction objectproperty(object_id, N'IsMSShipped')
pour chaque ligne alors qu'il y a un champ is_ms_shipped
qui contient cette valeur? Dans le même ordre d'idées, pourquoi exécuter à nouveau cette fonction quand [type] IN ('P', 'PC')
fait la même chose? Cette méthode est inutilement compliquée et inefficace.
J'ai modifié l'excellent article de LostCajun ci-dessus pour exclure les procédures stockées du système. J'ai également supprimé "Extraire". du code parce que je ne pouvais pas comprendre à quoi il sert et cela m'a donné des erreurs. L'instruction "fetch next" à l'intérieur de la boucle avait également besoin d'une clause "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;
la meilleure façon d'obtenir des objets est d'utiliser sys.sql_modules. vous pouvez trouver tout ce que vous voulez dans cette table et joindre cette table à une autre table pour obtenir plus d'informations par object_id
SELECT 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'
select *
from dbo.sysobjects
where xtype = 'P'
and status > 0
dbo.sys*
vues. Cette requête filtre également les procédures stockées CLR.
J'ai écrit ce simple tsql pour lister le texte de toutes les procédures stockées. Assurez-vous de remplacer le nom de votre base de données dans le champ.
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;
Cela va montrer toutes les procédures stockées et le code:
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'
Ceci, listez tout ce que vous voulez
Dans 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'"
OU
SELECT * FROM information_schema.tables
SELECT * FROM information_schema.VIEWS
sp_tables
. En outre, "PROCEDURE" n'est pas une option valide pour sp_tables
. Les seules options pour @table_type
sont: «TABLEAU SYSTÈME», «TABLE» et «AFFICHER».
Cela renverra tout le nom sp
Select *
FROM sys.procedures where [type] = 'P'
AND is_ms_shipped = 0
AND [name] not like 'sp[_]%diagram%'
[type]
doit être [type] IN ('P', 'PC')
sinon vous filtrez tous les proc stockés CLR qui sont potentiellement là.
Essayez ce lien codeplex, cet utilitaire aide à localiser toutes les procédures stockées à partir de la base de données SQL.
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')
USE DBNAME
select ROUTINE_NAME from information_schema.routines
where routine_type = 'PROCEDURE'
GO
Cela fonctionnera sur mssql.
Sélectionnez la liste des procédures stockées dans SQL Server. Reportez-vous ici pour en savoir plus: https://coderrooms.blogspot.com/2017/06/select-list-of-stored-procedure-in-sql.html
PaymentDetails
table. L'OP souhaite une liste des procédures stockées réelles.