Database
 sql >> Base de Dados >  >> RDS >> Database

4 maneiras de obter a definição de um procedimento armazenado usando o Transact-SQL


Este artigo apresenta 4 maneiras de usar o T-SQL para obter a definição de um procedimento armazenado no SQL Server.

A definição é a instrução T-SQL real usada para criar o procedimento armazenado.

Três dos métodos aqui são exatamente os mesmos usados ​​para retornar a definição de uma visualização (exceto aqui, eles estão sendo usados ​​em procedimentos armazenados em vez de visualizações).


Exemplo 1 – A Exibição do Catálogo do Sistema sys.sql_modules


Os sys.sql_modules a exibição do catálogo do sistema retorna uma linha para cada objeto que é um módulo definido pela linguagem SQL no SQL Server.

Em outras palavras, você pode usar essa visualização para retornar informações sobre objetos de vários tipos, incluindo funções, visualizações e, claro, procedimentos armazenados.

Uma das colunas retornadas com esta visão é chamada de definition . Como o nome indica, isso retorna a definição do 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
              |
+--------------+

Eu usei uma interface de linha de comando (CLI) com este exemplo, então o resultado é bem formatado.

Se você usar uma GUI (como SSMS ou Azure Data Studio) para retornar os resultados em uma grade, a definição provavelmente será retornada em uma linha longa em uma única célula. Nesses casos, você precisará fazer algum trabalho extra se quiser que ele seja exibido em um formato mais legível. Alternativamente, você pode usar o sp_helptext método abaixo.

Exemplo 2 – O procedimento armazenado do sistema sp_helptext


Outro método de retornar a definição de um procedimento armazenado é usar o sp_helptext procedimento armazenado do sistema. Além de poder retornar a definição para procedimentos armazenados (não criptografados), ele também pode retornar a definição de uma regra definida pelo usuário, padrão, exibição, função Transact-SQL definida pelo usuário, gatilho, coluna computada, CHECK restrição ou objeto do sistema, como um procedimento armazenado do sistema.

Esse procedimento armazenado exibe a definição em várias linhas. Cada linha contém 255 caracteres da definição T-SQL.

Exemplo:
EXEC sp_helptext 'uspGetAlbumsByArtist';

Aqui está o resultado que recebo ao usar uma GUI (Azure Data Studio):



E aqui está o que eu recebo usando minha interface de linha de comando:
+--------+
| Text   |
|--------|
| CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS
        |
| SELECT AlbumName
        |
| FROM [dbo].[Albums]
        |
| WHERE ArtistId = @ArtistId
        |
+--------+

Exemplo 3 – A função OBJECT_DEFINITION()


Outra maneira de retornar a definição de um procedimento armazenado é usar o OBJECT_DEFINITION() função. Assim como os métodos anteriores, este método também pode retornar a definição de outros tipos de objetos.

Aqui está um exemplo de uso desta função:
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
              |
+--------------+

Exemplo 4 – A Visualização do Esquema de Informações do Sistema ROUTINES


As ROUTINES a visualização do esquema de informações do sistema também pode retornar a definição de procedimentos armazenados (e funções também).

Essa visualização retorna muitas colunas, uma das quais é a definição do objeto. Portanto, podemos nomear essa coluna para retornar apenas a definição:
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
                      |
+----------------------+

Observe que a ROUTINE_DEFINITION coluna nesta visualização do sistema tem um comprimento máximo de nvarchar(4000) . Para definições maiores que isso, você pode usar o OBJECT_DEFINITION() função ou o sys.sql_modules ver nos exemplos anteriores. Ambos usam nvarchar(max) para a definição, para que eles não tenham a limitação de caracteres do ROUTINE_DEFINITION coluna (que, como mencionado, é nvarchar(4000) ).