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

4 modi per ottenere la definizione di una stored procedure utilizzando Transact-SQL

Questo articolo presenta 4 modi per utilizzare T-SQL per ottenere la definizione di una stored procedure in SQL Server.

La definizione è l'effettiva istruzione T-SQL utilizzata per creare la procedura memorizzata.

Tre dei metodi qui sono esattamente gli stessi utilizzati per restituire la definizione di una vista (tranne che in questo caso, vengono utilizzati nelle procedure archiviate anziché nelle viste).

Esempio 1 – La vista del catalogo di sistema sys.sql_modules

I sys.sql_modules la visualizzazione del catalogo di sistema restituisce una riga per ogni oggetto che è un modulo definito dal linguaggio SQL in SQL Server.

In altre parole, puoi utilizzare questa vista per restituire informazioni su oggetti di vario tipo, incluse funzioni, viste e, naturalmente, stored procedure.

Una delle colonne restituite con questa vista è chiamata definition . Come suggerisce il nome, restituisce la definizione dell'oggetto.

SELECT definition
FROM sys.sql_modules
WHERE object_id = object_id('uspGetAlbumsByArtist');

Risultato:

+--------------+
| definition   |
|--------------|
| CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS
SELECT AlbumName
FROM [dbo].[Albums]
WHERE ArtistId = @ArtistId
              |
+--------------+

Ho usato un'interfaccia a riga di comando (CLI) con questo esempio, quindi il risultato è ben formattato.

Se si usa una GUI (come SSMS o Azure Data Studio) per restituire i risultati in una griglia, è probabile che la definizione venga restituita in una riga lunga in una singola cella. In questi casi dovrai fare del lavoro extra se vuoi che venga visualizzato in un formato più leggibile. In alternativa, puoi usare il sp_helptext metodo di seguito.

Esempio 2:la stored procedure di sistema sp_helptext

Un altro metodo per restituire la definizione di una procedura memorizzata consiste nell'utilizzare sp_helptext procedura memorizzata di sistema. Oltre a restituire la definizione di stored procedure (non crittografate), può anche restituire la definizione di una regola definita dall'utente, un valore predefinito, una vista, una funzione Transact-SQL definita dall'utente, un trigger, una colonna calcolata, CHECK vincolo o un oggetto di sistema come una procedura memorizzata di sistema.

Questa procedura memorizzata visualizza la definizione su più righe. Ogni riga contiene 255 caratteri della definizione T-SQL.

Esempio:

EXEC sp_helptext 'uspGetAlbumsByArtist';

Ecco il risultato che ottengo quando utilizzo una GUI (Azure Data Studio):

Ed ecco cosa ottengo usando la mia interfaccia a riga di comando:

+--------+
| Text   |
|--------|
| CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS
        |
| SELECT AlbumName
        |
| FROM [dbo].[Albums]
        |
| WHERE ArtistId = @ArtistId
        |
+--------+

Esempio 3 – La funzione OBJECT_DEFINITION()

Un altro modo per restituire la definizione di una procedura memorizzata consiste nell'usare OBJECT_DEFINITION() funzione. Come con i metodi precedenti, anche questo metodo può restituire la definizione di altri tipi di oggetti.

Ecco un esempio di utilizzo di questa funzione:

SELECT OBJECT_DEFINITION(
        OBJECT_ID('uspGetAlbumsByArtist')
    ) AS [Definition];

Risultato:

+--------------+
| Definition   |
|--------------|
| CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS
SELECT AlbumName
FROM [dbo].[Albums]
WHERE ArtistId = @ArtistId
              |
+--------------+

Esempio 4 – Visualizzazione dello schema delle informazioni di sistema ROUTINE

Le ROUTINES la visualizzazione dello schema delle informazioni di sistema può anche restituire la definizione di stored procedure (e anche di funzioni).

Questa vista restituisce molte colonne, una delle quali è la definizione dell'oggetto. Pertanto possiamo nominare quella colonna per restituire solo la definizione:

SELECT ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_NAME = 'uspGetAlbumsByArtist';

Risultato:

+----------------------+
| ROUTINE_DEFINITION   |
|----------------------|
| CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS
SELECT AlbumName
FROM [dbo].[Albums]
WHERE ArtistId = @ArtistId
                      |
+----------------------+

Nota che il ROUTINE_DEFINITION la colonna in questa vista di sistema ha una lunghezza massima di nvarchar(4000) . Per definizioni più grandi di questa, puoi usare OBJECT_DEFINITION() funzione o il sys.sql_modules vista negli esempi precedenti. Entrambi usano nvarchar(max) per la definizione, quindi non hanno la limitazione di caratteri della ROUTINE_DEFINITION colonna (che, come accennato, è nvarchar(4000) ).