답변:
Mike가 말했듯이 가장 좋은 방법은을 사용하는 것 information_schema
입니다. master 데이터베이스에 있지 않으면 시스템 저장 프로 시저가 반환되지 않습니다.
SELECT *
FROM DatabaseName.INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'PROCEDURE'
어떤 이유로 master 데이터베이스에 비 시스템 저장 프로 시저가있는 경우 쿼리를 사용할 수 있습니다 (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')
dbo.sys*
뷰 에서 벗어나야합니다 . 이 쿼리는 또한 CLR 저장 프로 시저를 필터링하고 시스템 저장 프로 시저를 필터링하지 않으며 [type]은 WHERE 조건이므로 항상 'P'인 것으로 알려진 경우 [type]을 반환합니다.
SQL Server 2005를 사용하는 경우 다음이 작동합니다.
select *
from sys.procedures
where is_ms_shipped = 0
아래 쿼리 중 하나를 사용하여 하나의 데이터베이스에서 저장 프로 시저 목록을 찾을 수 있습니다.
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
또한 시스템 절차를 제외한 절차를 나열하는 데 도움이 될 수 있습니다.
select * from sys.all_objects where type='p' and is_ms_shipped=0
sys.all_objects
필터링 중이므로 사용할 이유가 없습니다 is_ms_shipped=0
. DDL 트리거를 포함 할 수 있지만에 의해 필터링됩니다 type='p'
. 당신은뿐만 아니라 사용할 수 있습니다 sys.objects
.
불행히도 INFORMATION_SCHEMA
시스템 프로세스에 대한 정보는 포함되어 있지 않습니다.
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
하시겠습니까? 그리고 왜 그 값을 포함 objectproperty(object_id, N'IsMSShipped')
하는 필드가있을 때 모든 행에 대해 함수 를 실행 is_ms_shipped
합니까? 같은 줄을 따라 왜 [type] IN ('P', 'PC')
같은 일을 할 때 그 기능을 다시 실행 합니까? 이 방법은 불필요하게 복잡하고 비효율적입니다.
시스템 저장 프로 시저를 제외하기 위해 위의 LostCajun의 우수한 게시물을 조정했습니다. 나는 또한 "추출"을 제거했습니다. 그것이 무엇인지 알 수 없었기 때문에 코드에서 오류가 발생했습니다. 루프 내부의 "fetch next"문에도 "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;
객체를 얻는 가장 좋은 방법은 sys.sql_modules를 사용하는 것입니다. 이 테이블에서 원하는 모든 것을 찾고이 테이블을 다른 테이블과 조인하여 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*
뷰 에서 벗어나야합니다 . 이 쿼리는 CLR 저장 프로시 저도 필터링합니다.
이 간단한 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;
모든 저장 프로 시저와 코드가 표시됩니다.
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'
이것은 당신이 원하는 모든 것을 나열
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'"
또는
SELECT * FROM information_schema.tables
SELECT * FROM information_schema.VIEWS
sp_tables
. 또한 "PROCEDURE"는 유효한 옵션이 아닙니다 sp_tables
. 유일한 옵션 @table_type
은 'SYSTEM TABLE', 'TABLE'및 'VIEW'입니다.
이것은 모든 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 저장 발동을 필터링하고 있습니다.
이 코드 플렉스 링크를 사용해보십시오.이 유틸리티는 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')
SQL Server에서 저장 프로 시저 목록을 선택하십시오. 자세한 내용은 여기를 참조하십시오 : https://coderrooms.blogspot.com/2017/06/select-list-of-stored-procedure-in-sql.html
PaymentDetails
테이블 에서 레코드 목록을 반환하는 저장 프로 시저를 만드는 것 같습니다. OP는 실제 저장 프로 시저 목록을 원합니다.