Qual consulta pode retornar os nomes de todos os procedimentos armazenados em um banco de dados do SQL Server
Se a consulta pudesse excluir procedimentos armazenados do sistema, isso seria ainda mais útil.
Qual consulta pode retornar os nomes de todos os procedimentos armazenados em um banco de dados do SQL Server
Se a consulta pudesse excluir procedimentos armazenados do sistema, isso seria ainda mais útil.
Respostas:
Como Mike afirmou, a melhor maneira é usar information_schema
. Enquanto você não estiver no banco de dados mestre, os procedimentos armazenados do sistema não serão retornados.
SELECT *
FROM DatabaseName.INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'PROCEDURE'
Se, por algum motivo, você tiver procedimentos armazenados fora do sistema no banco de dados mestre, poderá usar a consulta (isso filtrará a maioria dos procedimentos armazenados no 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*
exibição. Essa consulta também: filtra os procedimentos armazenados do CLR, não filtra os procs armazenados do sistema e retorna [type] quando se sabe que [type] sempre será 'P', pois é a condição WHERE.
O seguinte retornará todos os procedimentos no banco de dados selecionado
SELECT * FROM sys.procedures
Se você estiver usando o SQL Server 2005, o seguinte funcionará:
select *
from sys.procedures
where is_ms_shipped = 0
Você pode usar uma das consultas abaixo para encontrar a lista de Procedimentos armazenados em um banco de dados:
Consulta1:
SELECT
*
FROM sys.procedures;
Consulta2:
SELECT
*
FROM information_schema.routines
WHERE ROUTINE_TYPE = 'PROCEDURE'
Se você deseja encontrar a lista de todos os SPs em todos os bancos de dados, use a consulta abaixo:
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
Selecionar todos os procedimentos e exibições armazenados
select name,type,type_desc
from sys.objects
where type in ('V','P')
order by name,type
Isso também pode ajudar a listar o procedimento, exceto os procedimentos do sistema:
select * from sys.all_objects where type='p' and is_ms_shipped=0
sys.all_objects
pois você está filtrando is_ms_shipped=0
. Pode conter gatilhos DDL, mas esses seriam filtrados por type='p'
. Você também pode usar sys.objects
.
Infelizmente INFORMATION_SCHEMA
não contém informações sobre os procs do 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 por que você executaria uma função objectproperty(object_id, N'IsMSShipped')
para cada linha quando há um campo is_ms_shipped
que contém esse valor? Na mesma linha, por que executar essa função novamente quando [type] IN ('P', 'PC')
faz a mesma coisa? Este método é desnecessariamente complicado e ineficiente.
Alterei a excelente postagem de LostCajun acima para excluir os procedimentos armazenados do sistema. Também removi "Extrair". do código porque eu não conseguia descobrir para que serve e isso me deu erros. A instrução "buscar próximo" dentro do loop também precisava de uma cláusula "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;
a melhor maneira de obter objetos é usar sys.sql_modules. você pode encontrar tudo o que deseja dessa tabela e associá-la a outra tabela para obter mais informações por 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*
exibição. Essa consulta também filtra os procedimentos armazenados do CLR.
Eu escrevi este tsql simples para listar o texto de todos os procedimentos armazenados. Certifique-se de substituir o nome do banco de dados no 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;
Isso mostrará todos os procedimentos armazenados e o código:
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'
Isto, liste todas as coisas que você deseja
No 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
,. Além disso, "PROCEDURE" não é uma opção válida para sp_tables
. As únicas opções para @table_type
são: 'SYSTEM TABLE', 'TABLE' e 'VIEW'.
Isso retornará todos os nomes sp
Select *
FROM sys.procedures where [type] = 'P'
AND is_ms_shipped = 0
AND [name] not like 'sp[_]%diagram%'
[type]
deve ser [type] IN ('P', 'PC')
outra coisa: você está filtrando todos os procs armazenados do CLR que estão potencialmente lá.
Experimente este link codeplex, este utilitário ajuda a localizar todos os procedimentos armazenados do banco de dados 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
Isso funcionará no mssql.
Selecione a lista de procedimentos armazenados no servidor SQL. Consulte aqui: https://coderrooms.blogspot.com/2017/06/select-list-of-stored-procedure-in-sql.html
PaymentDetails
tabela. O OP deseja uma lista dos procedimentos armazenados reais.