Quale query può restituire i nomi di tutte le procedure memorizzate in un database di SQL Server
Se la query potesse escludere le procedure memorizzate dal sistema, ciò sarebbe ancora più utile.
Quale query può restituire i nomi di tutte le procedure memorizzate in un database di SQL Server
Se la query potesse escludere le procedure memorizzate dal sistema, ciò sarebbe ancora più utile.
Risposte:
Come ha affermato Mike, il modo migliore è usare information_schema
. Finché non ci si trova nel database principale, le procedure memorizzate dal sistema non verranno restituite.
SELECT *
FROM DatabaseName.INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'PROCEDURE'
Se per qualche motivo nel database master fossero presenti procedure memorizzate non di sistema, è possibile utilizzare la query (ciò filtrerà la maggior parte delle procedure memorizzate di sistema):
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*
visualizzazioni. Questa query inoltre: filtra le stored procedure CLR, non filtra i proc memorizzati di sistema e restituisce [tipo] quando è noto che [tipo] sarà sempre 'P' poiché è la condizione WHERE.
Di seguito verranno restituite tutte le procedure nel database selezionato
SELECT * FROM sys.procedures
Se si utilizza SQL Server 2005, funzionerà quanto segue:
select *
from sys.procedures
where is_ms_shipped = 0
È possibile utilizzare una delle query seguenti per trovare l'elenco delle Stored procedure in un database:
Query1:
SELECT
*
FROM sys.procedures;
Query2:
SELECT
*
FROM information_schema.routines
WHERE ROUTINE_TYPE = 'PROCEDURE'
Se si desidera trovare l'elenco di tutti gli SP in tutti i database, è possibile utilizzare la query seguente:
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
Seleziona Tutte le stored procedure e le visualizzazioni
select name,type,type_desc
from sys.objects
where type in ('V','P')
order by name,type
Questo può anche aiutare a elencare la procedura tranne le procedure di sistema:
select * from sys.all_objects where type='p' and is_ms_shipped=0
sys.all_objects
poiché si sta filtrando is_ms_shipped=0
. Può contenere trigger DDL, ma quelli verrebbero filtrati type='p'
. Potresti anche usare sys.objects
.
Sfortunatamente INFORMATION_SCHEMA
non contiene informazioni sui proc di sistema.
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
? E perché dovresti eseguire una funzione objectproperty(object_id, N'IsMSShipped')
per ogni riga quando c'è un campo is_ms_shipped
che contiene quel valore? Sulla stessa linea, perché eseguire di nuovo quella funzione quando [type] IN ('P', 'PC')
fa la stessa cosa? Questo metodo è inutilmente complicato e inefficiente.
Ho modificato l'eccellente post di LostCajun sopra per escludere le procedure memorizzate dal sistema. Ho anche rimosso "Estrai". dal codice perché non sono riuscito a capire a cosa serva e mi ha dato errori. L'istruzione "fetch next" all'interno del loop necessitava anche di una clausola "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;
il modo migliore per ottenere oggetti è usare sys.sql_modules. puoi trovare tutto ciò che desideri da questa tabella e unire questa tabella con altre tabelle per ottenere ulteriori informazioni da 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*
visualizzazioni. Questa query filtra anche le stored procedure CLR.
Ho scritto questo semplice tsql per elencare il testo di tutte le procedure memorizzate. Assicurati di sostituire il nome del tuo database nel campo.
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;
Questo mostrerà tutte le procedure memorizzate e il codice:
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'
Questo, elenca tutte le cose che vuoi
In 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'"
O
SELECT * FROM information_schema.tables
SELECT * FROM information_schema.VIEWS
sp_tables
. Inoltre, "PROCEDURA" non è un'opzione valida per sp_tables
. Le uniche opzioni per @table_type
sono: 'TABELLA SISTEMA', 'TABELLA' e 'VISUALIZZA'.
Questo restituirà tutto il nome sp
Select *
FROM sys.procedures where [type] = 'P'
AND is_ms_shipped = 0
AND [name] not like 'sp[_]%diagram%'
[type]
dovrebbe essere [type] IN ('P', 'PC')
altrimenti stai filtrando qualsiasi proc memorizzato CLR potenzialmente presente.
Prova questo collegamento codeplex, questa utility aiuta a localizzare tutte le procedure memorizzate dal database 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
Questo funzionerà su mssql.
Seleziona l'elenco delle procedure memorizzate nel server SQL. Fare riferimento qui per ulteriori informazioni: https://coderrooms.blogspot.com/2017/06/select-list-of-stored-procedure-in-sql.html
PaymentDetails
tabella. L'OP vuole un elenco delle attuali procedure memorizzate.