W tym artykule przedstawiono 4 sposoby wykorzystania T-SQL do uzyskania definicji procedury składowanej w SQL Server.
Definicja jest faktyczną instrukcją T-SQL używaną do tworzenia procedury składowanej.
Trzy z tych metod są dokładnie takie same, jak te używane do zwracania definicji widoku (z wyjątkiem tego, że są one używane w procedurach składowanych zamiast widokach).
Przykład 1 – Widok katalogu systemu sys.sql_modules
sys.sql_modules widok katalogu systemowego zwraca wiersz dla każdego obiektu, który jest modułem zdefiniowanym w języku SQL w SQL Server.
Innymi słowy, możesz użyć tego widoku do zwrócenia informacji o obiektach różnych typów, w tym o funkcjach, widokach i oczywiście procedurach składowanych.
Jedna z kolumn zwracanych z tym widokiem nazywa się definition . Jak sama nazwa wskazuje, zwraca definicję obiektu.
SELECT definition
FROM sys.sql_modules
WHERE object_id = object_id('uspGetAlbumsByArtist');
Wynik:
+--------------+
| definition |
|--------------|
| CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS
SELECT AlbumName
FROM [dbo].[Albums]
WHERE ArtistId = @ArtistId
|
+--------------+
W tym przykładzie użyłem interfejsu wiersza poleceń (CLI), więc wynik jest dobrze sformatowany.
Jeśli używasz graficznego interfejsu użytkownika (takiego jak SSMS lub Azure Data Studio), aby zwrócić wyniki w siatce, definicja prawdopodobnie zostanie zwrócona w jednym długim wierszu w jednej komórce. W takich przypadkach będziesz musiał wykonać dodatkową pracę, jeśli chcesz, aby wyświetlał się w bardziej czytelnym formacie. Alternatywnie możesz użyć sp_helptext metoda poniżej.
Przykład 2 – Procedura przechowywana w systemie sp_helptext
Inną metodą zwracania definicji procedury składowanej jest użycie sp_helptext systemowa procedura składowana. Oprócz możliwości zwrócenia definicji (niezaszyfrowanych) procedur składowanych, może również zwrócić definicję reguły zdefiniowanej przez użytkownika, wartość domyślną, widok, funkcję Transact-SQL zdefiniowaną przez użytkownika, wyzwalacz, kolumnę wyliczoną, CHECK ograniczenie lub obiekt systemowy, taki jak systemowa procedura składowana.
Ta procedura składowana wyświetla definicję w wielu wierszach. Każdy wiersz zawiera 255 znaków definicji T-SQL.
Przykład:
EXEC sp_helptext 'uspGetAlbumsByArtist';
Oto wynik, który otrzymuję podczas korzystania z GUI (Azure Data Studio):

A oto, co otrzymuję za pomocą interfejsu wiersza poleceń:
+--------+
| Text |
|--------|
| CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS
|
| SELECT AlbumName
|
| FROM [dbo].[Albums]
|
| WHERE ArtistId = @ArtistId
|
+--------+
Przykład 3 – Funkcja OBJECT_DEFINITION()
Innym sposobem na zwrócenie definicji procedury składowanej jest użycie OBJECT_DEFINITION() funkcjonować. Podobnie jak w przypadku poprzednich metod, ta metoda może również zwrócić definicję innych typów obiektów.
Oto przykład użycia tej funkcji:
SELECT OBJECT_DEFINITION(
OBJECT_ID('uspGetAlbumsByArtist')
) AS [Definition];
Wynik:
+--------------+
| Definition |
|--------------|
| CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS
SELECT AlbumName
FROM [dbo].[Albums]
WHERE ArtistId = @ArtistId
|
+--------------+
Przykład 4 – Widok schematu informacji o systemie ROUTINES
ROUTINES Widok schematu informacji o systemie może również zwracać definicję procedur składowanych (i funkcji również).
Ten widok zwraca wiele kolumn, z których jedna to definicja obiektu. Dlatego możemy nazwać tę kolumnę, aby zwrócić tylko definicję:
SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'uspGetAlbumsByArtist';
Wynik:
+----------------------+
| ROUTINE_DEFINITION |
|----------------------|
| CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS
SELECT AlbumName
FROM [dbo].[Albums]
WHERE ArtistId = @ArtistId
|
+----------------------+
Zwróć uwagę, że ROUTINE_DEFINITION kolumna w tym widoku systemowym ma maksymalną długość nvarchar(4000) . W przypadku definicji większych niż ta, możesz użyć OBJECT_DEFINITION() funkcja lub sys.sql_modules widok w poprzednich przykładach. Oba używają nvarchar(max) dla definicji, więc nie mają ograniczenia znaków ROUTINE_DEFINITION kolumna (która, jak wspomniano, to nvarchar(4000) ).