sql >> Databasteknik >  >> RDS >> Database

4 sätt att få definitionen av en lagrad procedur med Transact-SQL

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


  1. Postgres-fel:Mer än en rad returneras av en underfråga som används som uttryck

  2. få id för flera rader infogade i psycopg2

  3. ExecuteNonQuery returnerar -1 när du använder sql COUNT trots frågesträngen

  4. Hur listar jag alla kolumner i en tabell?