Denne artikel præsenterer 4 måder at bruge T-SQL til at få definitionen af en lagret procedure i SQL Server.
Definitionen er den faktiske T-SQL-sætning, der bruges til at oprette den lagrede procedure.
Tre af metoderne her er nøjagtig de samme som dem, der bruges til at returnere definitionen af en visning (undtagen her, de bliver brugt på lagrede procedurer i stedet for visninger).
Eksempel 1 – Sys.sql_modules systemkatalogvisning
sys.sql_modules
systemkatalogvisning returnerer en række for hvert objekt, der er et SQL-sprogdefineret modul i SQL Server.
Med andre ord kan du bruge denne visning til at returnere information om objekter af forskellige typer, inklusive funktioner, visninger og selvfølgelig lagrede procedurer.
En af kolonnerne, der returneres med denne visning, kaldes definition
. Som navnet antyder, returnerer dette objektets definition.
SELECT definition FROM sys.sql_modules WHERE object_id = object_id('uspGetAlbumsByArtist');
Resultat:
+--------------+ | definition | |--------------| | CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [dbo].[Albums] WHERE ArtistId = @ArtistId | +--------------+
Jeg brugte en kommandolinjegrænseflade (CLI) med dette eksempel, så resultatet er pænt formateret.
Hvis du bruger en GUI (såsom SSMS eller Azure Data Studio) til at returnere resultaterne i et gitter, vil definitionen sandsynligvis blive returneret i en lang linje i en enkelt celle. I sådanne tilfælde bliver du nødt til at gøre noget ekstra arbejde, hvis du vil have det vist i et mere læsbart format. Alternativt kan du bruge sp_helptext
metode nedenfor.
Eksempel 2 – Sp_helptext-systemets lagrede procedure
En anden metode til at returnere en lagret procedures definition er at bruge sp_helptext
system lagret procedure. Ud over at være i stand til at returnere definitionen for (ukrypterede) lagrede procedurer, kan den også returnere definitionen af en brugerdefineret regel, standard, visning, brugerdefineret Transact-SQL funktion, trigger, beregnet kolonne, CHECK
begrænsning eller systemobjekt såsom en systemlagret procedure.
Denne lagrede procedure viser definitionen på tværs af flere rækker. Hver række indeholder 255 tegn i T-SQL-definitionen.
Eksempel:
EXEC sp_helptext 'uspGetAlbumsByArtist';
Her er resultatet, jeg får, når jeg bruger en GUI (Azure Data Studio):
Og her er, hvad jeg får ved at bruge min kommandolinjegrænseflade:
+--------+ | Text | |--------| | CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS | | SELECT AlbumName | | FROM [dbo].[Albums] | | WHERE ArtistId = @ArtistId | +--------+
Eksempel 3 – OBJECT_DEFINITION()-funktionen
En anden måde at returnere definitionen af en lagret procedure på er at bruge OBJECT_DEFINITION()
fungere. Som med de tidligere metoder kan denne metode også returnere definitionen af andre objekttyper.
Her er et eksempel på brug af denne funktion:
SELECT OBJECT_DEFINITION( OBJECT_ID('uspGetAlbumsByArtist') ) AS [Definition];
Resultat:
+--------------+ | Definition | |--------------| | CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [dbo].[Albums] WHERE ArtistId = @ArtistId | +--------------+
Eksempel 4 – RUTINER System Information Schema View
ROUTINES
systeminformationsskemavisning kan også returnere definitionen af lagrede procedurer (og også funktioner).
Denne visning returnerer mange kolonner, hvoraf den ene er objektets definition. Derfor kan vi navngive den kolonne for kun at returnere definitionen:
SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'uspGetAlbumsByArtist';
Resultat:
+----------------------+ | ROUTINE_DEFINITION | |----------------------| | CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [dbo].[Albums] WHERE ArtistId = @ArtistId | +----------------------+
Bemærk, at ROUTINE_DEFINITION
kolonne i denne systemvisning har en maksimal længde på nvarchar(4000) . For definitioner, der er større end dette, kan du bruge OBJECT_DEFINITION()
funktion eller sys.sql_modules
se i de foregående eksempler. Begge disse bruger nvarchar(max) for definitionen, så de har ikke tegnbegrænsningen for ROUTINE_DEFINITION
kolonne (der som nævnt er nvarchar(4000) ).