Truy vấn nào có thể trả về tên của tất cả các thủ tục được lưu trữ trong cơ sở dữ liệu SQL Server
Nếu truy vấn có thể loại trừ các thủ tục lưu trữ hệ thống, điều đó sẽ hữu ích hơn nữa.
Truy vấn nào có thể trả về tên của tất cả các thủ tục được lưu trữ trong cơ sở dữ liệu SQL Server
Nếu truy vấn có thể loại trừ các thủ tục lưu trữ hệ thống, điều đó sẽ hữu ích hơn nữa.
Câu trả lời:
Như Mike đã nêu, cách tốt nhất là sử dụng information_schema
. Miễn là bạn không ở trong cơ sở dữ liệu chủ, các thủ tục lưu trữ hệ thống sẽ không được trả về.
SELECT *
FROM DatabaseName.INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'PROCEDURE'
Nếu vì lý do nào đó bạn có các thủ tục được lưu trữ ngoài hệ thống trong cơ sở dữ liệu chính, bạn có thể sử dụng truy vấn (điều này sẽ lọc ra các thủ tục lưu trữ hệ thống 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*
khung nhìn. Truy vấn này cũng: lọc ra các thủ tục được lưu trữ CLR, không lọc các procs được lưu trữ của hệ thống và trả về [type] khi biết rằng [type] sẽ luôn là 'P' vì đó là điều kiện WHERE.
Sau đây sẽ trả về tất cả các thủ tục trong cơ sở dữ liệu được chọn
SELECT * FROM sys.procedures
Nếu bạn đang sử dụng SQL Server 2005, phần sau sẽ hoạt động:
select *
from sys.procedures
where is_ms_shipped = 0
Bạn có thể sử dụng một trong các truy vấn dưới đây để tìm danh sách Thủ tục lưu trữ trong một cơ sở dữ liệu:
Truy vấn1:
SELECT
*
FROM sys.procedures;
Truy vấn2:
SELECT
*
FROM information_schema.routines
WHERE ROUTINE_TYPE = 'PROCEDURE'
Nếu bạn muốn tìm danh sách tất cả các SP trong tất cả Cơ sở dữ liệu, bạn có thể sử dụng truy vấn bên dưới:
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
Chọn tất cả các thủ tục và lượt xem được lưu trữ
select name,type,type_desc
from sys.objects
where type in ('V','P')
order by name,type
Điều này cũng có thể giúp liệt kê các thủ tục ngoại trừ các thủ tục hệ thống:
select * from sys.all_objects where type='p' and is_ms_shipped=0
sys.all_objects
vì bạn đang lọc is_ms_shipped=0
. Nó có thể chứa DDL Triggers, nhưng chúng sẽ được lọc ra type='p'
. Bạn cũng có thể sử dụng sys.objects
.
Thật không may INFORMATION_SCHEMA
, không chứa thông tin về các procs hệ thống.
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
? Và tại sao bạn lại chạy một hàm objectproperty(object_id, N'IsMSShipped')
cho mỗi hàng khi có một trường is_ms_shipped
chứa giá trị đó? Dọc theo cùng một dòng, tại sao chạy lại chức năng đó khi [type] IN ('P', 'PC')
làm điều tương tự? Phương pháp này phức tạp không cần thiết và không hiệu quả.
Tôi đã điều chỉnh bài đăng tuyệt vời của LostCajun ở trên để loại trừ các thủ tục lưu trữ hệ thống. Tôi cũng xóa "Trích xuất." từ mã bởi vì tôi không thể tìm ra nó để làm gì và nó đã cho tôi lỗi. Câu lệnh "tìm nạp tiếp theo" bên trong vòng lặp cũng cần một mệnh đề "vào".
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;
cách tốt nhất để có được các đối tượng là sử dụng sys.sql_modules. bạn có thể tìm thấy mọi thứ bạn muốn từ bảng này và nối bảng này với bảng khác để có thêm thông tin của 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*
khung nhìn. Truy vấn này cũng lọc ra các thủ tục lưu sẵn CLR.
Tôi đã viết tsql đơn giản này để liệt kê văn bản của tất cả các thủ tục được lưu trữ. Hãy chắc chắn để thay thế tên cơ sở dữ liệu của bạn trong trường.
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;
Điều này sẽ chỉ cung cấp tên của các thủ tục được lưu trữ.
select specific_name
from information_schema.routines
where routine_type = 'PROCEDURE';
Điều này sẽ hiển thị tất cả các thủ tục được lưu trữ và mã:
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'
Cái này, liệt kê tất cả những thứ bạn muốn
Trong máy chủ Sql 2005, 2008, 2012:
Use [YourDataBase]
EXEC sp_tables @table_type = "'PROCEDURE'"
EXEC sp_tables @table_type = "'TABLE'"
EXEC sp_tables @table_type = "'VIEW'"
HOẶC LÀ
SELECT * FROM information_schema.tables
SELECT * FROM information_schema.VIEWS
sp_tables
. Ngoài ra, "THỦ TỤC" không phải là một lựa chọn hợp lệ cho sp_tables
. Các tùy chọn duy nhất cho @table_type
là: 'BẢNG HỆ THỐNG', 'BẢNG' và 'XEM'.
Điều này sẽ trả về tất cả tên sp
Select *
FROM sys.procedures where [type] = 'P'
AND is_ms_shipped = 0
AND [name] not like 'sp[_]%diagram%'
[type]
nên là [type] IN ('P', 'PC')
bạn đang lọc ra bất kỳ procs lưu trữ CLR nào có khả năng ở đó.
Hãy thử liên kết codeplex này, tiện ích này giúp bản địa hóa tất cả các thủ tục được lưu trữ từ cơ sở dữ liệu 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
Điều này sẽ làm việc trên mssql.
Chọn danh sách các thủ tục được lưu trữ trong máy chủ SQL. Tham khảo tại đây để biết thêm: https://coderrooms.blogspot.com/2017/06/select-list-of-stored-procedure-in-sql.html
PaymentDetails
bảng. OP muốn có một danh sách các thủ tục lưu trữ thực tế.