Bài viết này trình bày 4 cách sử dụng T-SQL để lấy định nghĩa của một thủ tục được lưu trữ trong SQL Server.
Định nghĩa là câu lệnh T-SQL thực tế được sử dụng để tạo thủ tục được lưu trữ.
Ba trong số các phương thức ở đây hoàn toàn giống với các phương thức được sử dụng để trả về định nghĩa của một dạng xem (ngoại trừ ở đây, chúng đang được sử dụng trên các thủ tục được lưu trữ thay vì các dạng xem).
Ví dụ 1 - Chế độ xem danh mục hệ thống sys.sql_modules
sys.sql_modules
chế độ xem danh mục hệ thống trả về một hàng cho mỗi đối tượng là mô-đun do ngôn ngữ SQL xác định trong SQL Server.
Nói cách khác, bạn có thể sử dụng dạng xem này để trả về thông tin về các đối tượng thuộc nhiều kiểu khác nhau, bao gồm các hàm, dạng xem và tất nhiên, các thủ tục được lưu trữ.
Một trong các cột được trả về với chế độ xem này được gọi là definition
. Như tên của nó, nó trả về định nghĩa của đối tượng.
SELECT definition FROM sys.sql_modules WHERE object_id = object_id('uspGetAlbumsByArtist');
Kết quả:
+--------------+ | definition | |--------------| | CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [dbo].[Albums] WHERE ArtistId = @ArtistId | +--------------+
Tôi đã sử dụng giao diện dòng lệnh (CLI) với ví dụ này, vì vậy kết quả được định dạng độc đáo.
Nếu bạn sử dụng GUI (chẳng hạn như SSMS hoặc Azure Data Studio) để trả về kết quả dưới dạng lưới, định nghĩa có thể sẽ được trả về ở một dòng dài trong một ô. Trong những trường hợp như vậy, bạn sẽ cần phải thực hiện thêm một số công việc nếu bạn muốn nó hiển thị ở định dạng dễ đọc hơn. Ngoài ra, bạn có thể sử dụng sp_helptext
phương pháp bên dưới.
Ví dụ 2 - Thủ tục lưu trữ hệ thống sp_helptext
Một phương pháp khác để trả về định nghĩa của thủ tục được lưu trữ là sử dụng sp_helptext
hệ thống lưu trữ thủ tục. Ngoài việc có thể trả về định nghĩa cho các thủ tục được lưu trữ (không được mã hóa), nó cũng có thể trả về định nghĩa của quy tắc do người dùng xác định, mặc định, dạng xem, hàm Transact-SQL do người dùng xác định, trình kích hoạt, cột được tính, CHECK
ràng buộc hoặc đối tượng hệ thống chẳng hạn như một thủ tục được lưu trữ trong hệ thống.
Thủ tục được lưu trữ này hiển thị định nghĩa trên nhiều hàng. Mỗi hàng chứa 255 ký tự của định nghĩa T-SQL.
Ví dụ:
EXEC sp_helptext 'uspGetAlbumsByArtist';
Đây là kết quả tôi nhận được khi sử dụng GUI (Azure Data Studio):
Và đây là những gì tôi nhận được khi sử dụng giao diện dòng lệnh của mình:
+--------+ | Text | |--------| | CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS | | SELECT AlbumName | | FROM [dbo].[Albums] | | WHERE ArtistId = @ArtistId | +--------+
Ví dụ 3 - Hàm OBJECT_DEFINITION ()
Một cách khác để trả về định nghĩa của một thủ tục được lưu trữ là sử dụng OBJECT_DEFINITION()
hàm số. Cũng như các phương thức trước, phương thức này cũng có thể trả về định nghĩa của các kiểu đối tượng khác.
Dưới đây là một ví dụ về việc sử dụng chức năng này:
SELECT OBJECT_DEFINITION( OBJECT_ID('uspGetAlbumsByArtist') ) AS [Definition];
Kết quả:
+--------------+ | Definition | |--------------| | CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [dbo].[Albums] WHERE ArtistId = @ArtistId | +--------------+
Ví dụ 4 - Chế độ xem giản đồ thông tin hệ thống ROUTINES
ROUTINES
dạng xem lược đồ thông tin hệ thống cũng có thể trả về định nghĩa của các thủ tục được lưu trữ (và cả các hàm nữa).
Chế độ xem này trả về nhiều cột, một trong số đó là định nghĩa của đối tượng. Do đó, chúng ta có thể đặt tên cho cột đó để chỉ trả về định nghĩa:
SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'uspGetAlbumsByArtist';
Kết quả:
+----------------------+ | ROUTINE_DEFINITION | |----------------------| | CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [dbo].[Albums] WHERE ArtistId = @ArtistId | +----------------------+
Lưu ý rằng ROUTINE_DEFINITION
cột trong chế độ xem hệ thống này có độ dài tối đa là nvarchar (4000) . Đối với các định nghĩa lớn hơn, bạn có thể sử dụng OBJECT_DEFINITION()
chức năng hoặc sys.sql_modules
xem trong các ví dụ trước. Cả hai đều sử dụng nvarchar (max) đối với định nghĩa, vì vậy chúng không có giới hạn ký tự của ROUTINE_DEFINITION
(như đã đề cập, là nvarchar (4000) ).