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) ).