sql >> Base de Datos >  >> RDS >> Database

4 formas de obtener la definición de un procedimiento almacenado usando Transact-SQL

Este artículo presenta 4 formas de usar T-SQL para obtener la definición de un procedimiento almacenado en SQL Server.

La definición es la instrucción T-SQL real utilizada para crear el procedimiento almacenado.

Tres de los métodos aquí son exactamente los mismos que los que se usan para devolver la definición de una vista (excepto que aquí se usan en procedimientos almacenados en lugar de vistas).

Ejemplo 1:la vista de catálogo del sistema sys.sql_modules

Los sys.sql_modules la vista de catálogo del sistema devuelve una fila para cada objeto que es un módulo definido en lenguaje SQL en SQL Server.

En otras palabras, puede usar esta vista para devolver información sobre objetos de varios tipos, incluidas funciones, vistas y, por supuesto, procedimientos almacenados.

Una de las columnas devueltas con esta vista se llama definition . Como su nombre lo indica, esto devuelve la definición del objeto.

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

Resultado:

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

Usé una interfaz de línea de comandos (CLI) con este ejemplo, por lo que el resultado está bien formateado.

Si usa una GUI (como SSMS o Azure Data Studio) para devolver los resultados en una cuadrícula, es probable que la definición se devuelva en una línea larga en una sola celda. En tales casos, deberá hacer un trabajo adicional si desea que se muestre en un formato más legible. Alternativamente, podría usar el sp_helptext método a continuación.

Ejemplo 2:el procedimiento almacenado del sistema sp_helptext

Otro método para devolver la definición de un procedimiento almacenado es usar el sp_helptext procedimiento almacenado del sistema. Además de poder devolver la definición de procedimientos almacenados (sin cifrar), también puede devolver la definición de una regla definida por el usuario, predeterminada, vista, función Transact-SQL definida por el usuario, activador, columna calculada, CHECK restricción u objeto del sistema, como un procedimiento almacenado del sistema.

Este procedimiento almacenado muestra la definición en varias filas. Cada fila contiene 255 caracteres de la definición de T-SQL.

Ejemplo:

EXEC sp_helptext 'uspGetAlbumsByArtist';

Este es el resultado que obtengo cuando uso una GUI (Azure Data Studio):

Y esto es lo que obtengo usando mi interfaz de línea de comandos:

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

Ejemplo 3:la función OBJECT_DEFINITION()

Otra forma de devolver la definición de un procedimiento almacenado es usar OBJECT_DEFINITION() función. Al igual que con los métodos anteriores, este método también puede devolver la definición de otros tipos de objetos.

Aquí hay un ejemplo del uso de esta función:

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

Resultado:

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

Ejemplo 4:la vista de esquema de información del sistema ROUTINES

Las ROUTINES La vista de esquema de información del sistema también puede devolver la definición de procedimientos almacenados (y funciones también).

Esta vista devuelve muchas columnas, una de las cuales es la definición del objeto. Por lo tanto, podemos nombrar esa columna para devolver solo la definición:

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

Resultado:

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

Tenga en cuenta que ROUTINE_DEFINITION columna en esta vista del sistema tiene una longitud máxima de nvarchar(4000) . Para definiciones más grandes que esta, puede usar OBJECT_DEFINITION() o la función sys.sql_modules vista en los ejemplos anteriores. Ambos usan nvarchar(max) para la definición, por lo que no tienen la limitación de caracteres de ROUTINE_DEFINITION columna (que, como se mencionó, es nvarchar(4000) ).