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, cela serait encore plus utile.
Comme Mike l'a dit, le meilleur moyen est d'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 renvoyées.
select *
from DatabaseName.information_schema.routines
where routine_type = 'PROCEDURE'
Si, pour une raison quelconque, la base de données master contient des procédures stockées non système, vous pouvez utiliser la requête (ceci filtrera les procédures stockées système MOST):
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')
D'après ce que j'ai compris, la méthode "préférée" consiste à utiliser les tables information_schema:
select *
from information_schema.routines
where routine_type = 'PROCEDURE'
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
Ce qui suit retournera toutes les procédures dans la base de données sélectionnée
SELECT * FROM sys.procedures
Si vous utilisez SQL Server 2005, les opérations suivantes fonctionneront:
select *
from sys.procedures
where is_ms_shipped = 0
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
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ête 1:
SELECT
*
FROM sys.procedures;
Requête2:
SELECT
*
FROM information_schema.routines
WHERE ROUTINE_TYPE = 'PROCEDURE'
Si vous voulez 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
Cela peut aussi aider à lister les procédures sauf les procédures système:
select * from sys.all_objects where type='p' and is_ms_shipped=0
Malheureusement, INFORMATION_SCHEMA
ne contient pas d'informations sur les processus système.
SELECT *
FROM sys.objects
WHERE objectproperty(object_id, N'IsMSShipped') = 0
AND objectproperty(object_id, N'IsProcedure') = 1
Juste les noms:
SELECT SPECIFIC_NAME
FROM YOUR_DB_NAME.information_schema.routines
WHERE routine_type = 'PROCEDURE'
Cela ne donnera que les noms des procédures stockées.
select specific_name
from information_schema.routines
where routine_type = 'PROCEDURE';
J'ai écrit ce simple tsql pour lister le texte de toutes les procédures stockées. Assurez-vous de substituer votre nom de 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;
select *
from dbo.sysobjects
where xtype = 'P'
and status > 0
J'ai peaufiné l'excellent message de LostCajun ci-dessus pour exclure les procédures stockées système. J'ai aussi enlevé "Extrait". du code parce que je ne pouvais pas comprendre ce que c'est et ça m'a donné des erreurs. L'instruction "fetch next" dans 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;
Ceci, liste toutes les choses que tu veux
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'"
OR
SELECT * FROM information_schema.tables
SELECT * FROM information_schema.VIEWS
USE DBNAME
select ROUTINE_NAME from information_schema.routines
where routine_type = 'PROCEDURE'
GO
Cela fonctionnera sur mssql.
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')
Essayez ce lien codeplex, cet utilitaire aide à localiser toutes les procédures stockées à partir de la base de données SQL.
le meilleur moyen 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'
Cela retournera tous les noms sp
Select *
FROM sys.procedures where [type] = 'P'
AND is_ms_shipped = 0
AND [name] not like 'sp[_]%diagram%'
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'
Pour lister les procédures stockées pour une base de données MySQL particulière:
SHOW PROCEDURE STATUS WHERE db = 'databaseName';