Тази статия представя 4 начина за използване на T-SQL за получаване на дефиницията на съхранена процедура в SQL Server.
Дефиницията е действителният израз на T-SQL, използван за създаване на съхранената процедура.
Три от методите тук са абсолютно същите като тези, използвани за връщане на дефиницията на изглед (освен тук, те се използват за съхранени процедури вместо изгледи).
Пример 1 – Изгледът на системния каталог sys.sql_modules
sys.sql_modules
Изгледът на системния каталог връща ред за всеки обект, който е модул, дефиниран от SQL език в SQL Server.
С други думи, можете да използвате този изглед, за да връщате информация за обекти от различни типове, включително функции, изгледи и разбира се, съхранени процедури.
Една от колоните, върнати с този изглед, се нарича definition
. Както подсказва името, това връща дефиницията на обекта.
SELECT definition FROM sys.sql_modules WHERE object_id = object_id('uspGetAlbumsByArtist');
Резултат:
+--------------+ | definition | |--------------| | CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [dbo].[Albums] WHERE ArtistId = @ArtistId | +--------------+
Използвах интерфейс на командния ред (CLI) с този пример, така че резултатът е добре форматиран.
Ако използвате GUI (като SSMS или Azure Data Studio), за да върнете резултатите в мрежа, дефиницията вероятно ще бъде върната в един дълъг ред в една клетка. В такива случаи ще трябва да свършите допълнителна работа, ако искате да се показва в по-четлив формат. Като алтернатива можете да използвате sp_helptext
метод по-долу.
Пример 2 – Системната запаметена процедура sp_helptext
Друг метод за връщане на дефиницията на съхранена процедура е използването на sp_helptext
системна съхранена процедура. Освен че може да върне дефиницията за (некриптирани) съхранени процедури, той може също да върне дефиницията на дефинирано от потребител правило, по подразбиране, изглед, дефинирана от потребителя Transact-SQL функция, тригер, изчислена колона, CHECK
ограничение или системен обект, като например системна съхранена процедура.
Тази съхранена процедура показва дефиницията в множество редове. Всеки ред съдържа 255 знака от дефиницията на T-SQL.
Пример:
EXEC sp_helptext 'uspGetAlbumsByArtist';
Ето резултата, който получавам, когато използвам GUI (Azure Data Studio):
И ето какво получавам с моя интерфейс на командния ред:
+--------+ | Text | |--------| | CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS | | SELECT AlbumName | | FROM [dbo].[Albums] | | WHERE ArtistId = @ArtistId | +--------+
Пример 3 – Функцията OBJECT_DEFINITION()
Друг начин да върнете дефиницията на съхранена процедура е да използвате OBJECT_DEFINITION()
функция. Както при предишните методи, този метод може също да върне дефиницията на други типове обекти.
Ето пример за използване на тази функция:
SELECT OBJECT_DEFINITION( OBJECT_ID('uspGetAlbumsByArtist') ) AS [Definition];
Резултат:
+--------------+ | Definition | |--------------| | CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [dbo].[Albums] WHERE ArtistId = @ArtistId | +--------------+
Пример 4 – Изгледът на схемата за системна информация ROUTINES
ROUTINES
Изгледът на схемата за системна информация може също да върне дефиницията на съхранените процедури (и функциите също).
Този изглед връща много колони, една от които е дефиницията на обекта. Следователно можем да назовем тази колона, за да върнем само дефиницията:
SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'uspGetAlbumsByArtist';
Резултат:
+----------------------+ | ROUTINE_DEFINITION | |----------------------| | CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [dbo].[Albums] WHERE ArtistId = @ArtistId | +----------------------+
Обърнете внимание, че ROUTINE_DEFINITION
колоната в този системен изглед има максимална дължина от nvarchar(4000) . За дефиниции, по-големи от това, можете да използвате OBJECT_DEFINITION()
функция или sys.sql_modules
вижте в предишните примери. И двете използват nvarchar(max) за дефиницията, така че те нямат ограничението за знаци на ROUTINE_DEFINITION
колона (която, както споменахме, е nvarchar(4000) ).