Den här artikeln presenterar fyra sätt att använda T-SQL för att få definitionen av en lagrad procedur i SQL Server.
Definitionen är den faktiska T-SQL-satsen som används för att skapa den lagrade proceduren.
Tre av metoderna här är exakt samma som de som används för att returnera definitionen av en vy (förutom här används de på lagrade procedurer istället för vyer).
Exempel 1 – Sys.sql_modules systemkatalogvy
sys.sql_modules
systemkatalogvyn returnerar en rad för varje objekt som är en SQL-språkdefinierad modul i SQL Server.
Med andra ord kan du använda den här vyn för att returnera information om objekt av olika typer, inklusive funktioner, vyer och naturligtvis lagrade procedurer.
En av kolumnerna som returneras med denna vy kallas definition
. Som namnet antyder returnerar detta definitionen av objektet.
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 | +--------------+
Jag använde ett kommandoradsgränssnitt (CLI) med det här exemplet, så resultatet är snyggt formaterat.
Om du använder ett grafiskt användargränssnitt (som SSMS eller Azure Data Studio) för att returnera resultaten i ett rutnät, kommer definitionen sannolikt att returneras på en lång rad i en enda cell. I sådana fall måste du göra lite extra arbete om du vill att det ska visas i ett mer läsbart format. Alternativt kan du använda sp_helptext
metod nedan.
Exempel 2 – Sp_helptext-systemets lagrade procedur
En annan metod för att returnera en lagrad procedurs definition är att använda sp_helptext
systemlagrad procedur. Förutom att kunna returnera definitionen för (okrypterade) lagrade procedurer, kan den också returnera definitionen av en användardefinierad regel, standard, vy, användardefinierad Transact-SQL funktion, trigger, beräknad kolumn, CHECK
begränsning, eller systemobjekt såsom en systemlagrad procedur.
Denna lagrade procedur visar definitionen över flera rader. Varje rad innehåller 255 tecken i T-SQL-definitionen.
Exempel:
EXEC sp_helptext 'uspGetAlbumsByArtist';
Här är resultatet jag får när jag använder ett GUI (Azure Data Studio):
Och här är vad jag får med mitt kommandoradsgränssnitt:
+--------+ | Text | |--------| | CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS | | SELECT AlbumName | | FROM [dbo].[Albums] | | WHERE ArtistId = @ArtistId | +--------+
Exempel 3 – OBJECT_DEFINITION()-funktionen
Ett annat sätt att returnera definitionen av en lagrad procedur är att använda OBJECT_DEFINITION()
fungera. Som med de tidigare metoderna kan denna metod även returnera definitionen av andra objekttyper.
Här är ett exempel på hur du använder den här funktionen:
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 | +--------------+
Exempel 4 – Systeminformationsschemavyn för RUTINER
ROUTINES
systeminformationsschemavy kan också returnera definitionen av lagrade procedurer (och funktioner också).
Den här vyn returnerar många kolumner, varav en är objektets definition. Därför kan vi namnge den kolumnen för att bara returnera 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 | +----------------------+
Observera att ROUTINE_DEFINITION
kolumnen i denna systemvy har en maximal längd på nvarchar(4000) . För definitioner större än detta kan du använda OBJECT_DEFINITION()
funktion eller sys.sql_modules
se i de tidigare exemplen. Båda dessa använder nvarchar(max) för definitionen, så de har inte teckenbegränsningen för ROUTINE_DEFINITION
kolumn (som som nämnts är nvarchar(4000) ).