sql >> Database teknologi >  >> RDS >> Database

4 måder at få en lagret procedures definition ved hjælp af Transact-SQL

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


  1. rs.last() giver ugyldig operation for kun at videresende resultatersæt:sidste

  2. Konverter hex i tekstrepræsentation til decimaltal

  3. Oprettelse af en ny database og ny forbindelse i Oracle SQL Developer

  4. Formatering af tal ved at udfylde med indledende nuller i SQL Server