Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como redefinir as colunas retornadas por um procedimento armazenado no SQL Server


Quando você executa um procedimento armazenado que retorna um conjunto de resultados no SQL Server, as colunas retornadas são definidas no procedimento armazenado.

Mas você sabia que pode redefinir essas colunas?

O que quero dizer é que você pode alterar os nomes e/ou o tipo de dados das colunas retornadas no conjunto de resultados.

Isso pode evitar que você precise mexer nos cabeçalhos das colunas e nos formatos de dados caso precise usar esse conjunto de resultados em outra configuração.

Por exemplo, se um procedimento armazenado retornar um datetime2 coluna, mas você só precisa da parte de data, você pode especificar data para essa coluna e seu conjunto de resultados incluirá apenas a parte da data.

E a melhor parte é que você pode fazer isso como parte do EXECUTE demonstração. Não há necessidade de massagear os dados após a execução do procedimento. maneira de fazer isso é usando o WITH RESULT SETS cláusula do EXECUTE demonstração.

Exemplo


Aqui está um exemplo para demonstrar como usar o WITH RESULT SETS cláusula para alterar os nomes das colunas e os tipos de dados do conjunto de resultados de um procedimento armazenado.

Resultados brutos


Primeiro, vamos ver os resultados brutos de um procedimento armazenado.
EXEC sp_getCityById @CityId = 1;

Resultado:
+------------+----------------------------+-----------------------------+
| CityName   | LatestRecordedPopulation   | ValidFrom                   |
|------------+----------------------------+-----------------------------|
| Aaronsburg | 613                        | 2013-01-01 00:00:00.0000000 |
+------------+----------------------------+-----------------------------+

Dependendo de nossos requisitos, podemos desejar que o procedimento não use um cabeçalho de coluna tão longo para a população (LatestRecordedPopulation ).

Também podemos desejar que o ValidFrom coluna não incluiu a parte do tempo, pois ocupa espaço desnecessário e não é importante para nosso propósito específico.

Também podemos querer apresentar os cabeçalhos das colunas com um espaço, apenas para torná-lo um pouco mais apresentável para quem quer que o enviemos.

Redefinir as colunas


Agora vamos em frente e usar o WITH RESULT SETS cláusula para redefinir as colunas.
EXEC sp_getCityById @CityId = 1
WITH RESULT SETS   
(  
    (
        [City] nvarchar(50),
        [Population] int,
        [Valid From] date
    )
);

Resultado:
+------------+--------------+--------------+
| City       | Population   | Valid From   |
|------------+--------------+--------------|
| Aaronsburg | 613          | 2013-01-01   |
+------------+--------------+--------------+

Então, usando o WITH RESULT SETS cláusula, conseguimos alterar os nomes das colunas e o tipo de dados.

Na verdade, neste exemplo eu mudei o tipo de dados das duas últimas colunas de bigint para int , e de datetime2(7) até data , respectivamente.

Analise os conjuntos de resultados


Podemos usar visualizações de gerenciamento dinâmico, como sys.dm_exec_describe_first_result_set e sys.dm_exec_describe_first_result_set_for_object para descobrir os tipos de dados reais de cada conjunto de resultados.

Aqui está um exemplo de uso de sys.dm_exec_describe_first_result_set_for_object para obter os nomes das colunas e seus respectivos tipos de dados retornados pelo procedimento armazenado.
SELECT 
    name,
    system_type_name,
    max_length,
    [precision],
    scale,
    user_type_name
FROM sys.dm_exec_describe_first_result_set_for_object(OBJECT_ID('sp_getCityById'), 0);

Resultado:
+--------------------------+--------------------+--------------+-------------+---------+------------------+
| name                     | system_type_name   | max_length   | precision   | scale   | user_type_name   |
|--------------------------+--------------------+--------------+-------------+---------+------------------|
| CityName                 | nvarchar(50)       | 100          | 0           | 0       | NULL             |
| LatestRecordedPopulation | bigint             | 8            | 19          | 0       | NULL             |
| ValidFrom                | datetime2(7)       | 8            | 27          | 7       | NULL             |
+--------------------------+--------------------+--------------+-------------+---------+------------------+

Portanto, esses são os nomes reais das colunas e os tipos de dados retornados no conjunto de resultados (sem redefinir nada).

Podemos ver que as duas últimas colunas são bigint e datetime2(7) respectivamente.

Agora vamos usar sys.dm_exec_describe_first_result_set para obter os metadados de nossa consulta modificada.
SELECT 
    name,
    system_type_name,
    max_length,
    [precision],
    scale,
    user_type_name
FROM sys.dm_exec_describe_first_result_set(
    'EXEC sp_getCityById @CityId = 1
        WITH RESULT SETS   
        (  
            (
                [City] nvarchar(50),
                [Population] int,
                [Valid To] date
            )
        );', 
        null, 
        0
    );

Resultado:
+------------+--------------------+--------------+-------------+---------+------------------+
| name       | system_type_name   | max_length   | precision   | scale   | user_type_name   |
|------------+--------------------+--------------+-------------+---------+------------------|
| City       | nvarchar(50)       | 100          | 0           | 0       | NULL             |
| Population | int                | 4            | 10          | 0       | NULL             |
| Valid To   | date               | 3            | 10          | 0       | NULL             |
+------------+--------------------+--------------+-------------+---------+------------------+

Assim, podemos ver que os nomes das colunas foram alterados e os tipos de dados das duas últimas colunas também foram alterados conforme especificado.

Vários conjuntos de resultados


Alguns procedimentos armazenados retornam vários conjuntos de resultados. Ao usar WITH RESULT SETS nesses procedimentos, você precisa garantir que inclui definições para cada conjunto de resultados.

Você não pode simplesmente redefinir alguns, mas não os outros. Se você fizer isso, receberá um erro.

Se você precisar redefinir apenas um conjunto de resultados, precisará fazer todos eles – mesmo que suas definições permaneçam iguais à definição original.

Ao fazer isso, separe cada definição com uma vírgula.

Conjuntos de resultados originais


O procedimento a seguir retorna três conjuntos de resultados.
EXEC sp_getCityStateCountryByCityId @CityId = 1;

Resultado:
+------------+----------------------------+-----------------------------+
| CityName   | LatestRecordedPopulation   | ValidFrom                   |
|------------+----------------------------+-----------------------------|
| Aaronsburg | 613                        | 2013-01-01 00:00:00.0000000 |
+------------+----------------------------+-----------------------------+
(1 row affected)
+---------------------+---------------------+----------------------------+
| StateProvinceCode   | StateProvinceName   | LatestRecordedPopulation   |
|---------------------+---------------------+----------------------------|
| PA                  | Pennsylvania        | 13284753                   |
+---------------------+---------------------+----------------------------+
(1 row affected)
+-----------------+---------------+----------------------------+
| IsoAlpha3Code   | CountryName   | LatestRecordedPopulation   |
|-----------------+---------------+----------------------------|
| USA             | United States | 313973000                  |
+-----------------+---------------+----------------------------+
(1 row affected)

Conjuntos de resultados redefinidos


Podemos redefinir esses conjuntos de resultados com o código a seguir.
EXEC sp_getCityStateCountryByCityId @CityId = 1
WITH RESULT SETS   
(  
    (
        [City] nvarchar(50),
        [Population] int,
        [Valid From] date
    ),
    (
        [State Code] nvarchar(5),
        [State Name] nvarchar(50),
        [Population] int
    ),
    (
        [Country Code] nvarchar(3),
        [Country Name] nvarchar(60),
        [Population] int
    )
);

Resultado:
+------------+--------------+--------------+
| City       | Population   | Valid From   |
|------------+--------------+--------------|
| Aaronsburg | 613          | 2013-01-01   |
+------------+--------------+--------------+
(1 row affected)
+--------------+--------------+--------------+
| State Code   | State Name   | Population   |
|--------------+--------------+--------------|
| PA           | Pennsylvania | 13284753     |
+--------------+--------------+--------------+
(1 row affected)
+----------------+----------------+--------------+
| Country Code   | Country Name   | Population   |
|----------------+----------------+--------------|
| USA            | United States  | 313973000    |
+----------------+----------------+--------------+
(1 row affected)

Reduzindo o número de colunas retornadas pelo procedimento armazenado


Quando eu descobri sobre os WITH RESULT SETS cláusula, fiquei animado, porque pensei que forneceria uma maneira simples de reduzir o número de colunas retornadas pelo procedimento armazenado.

Infelizmente, não é o caso.

Se você não incluir todas as colunas retornadas pelo procedimento armazenado em seu WITH RESULT SETS cláusula, você receberá um erro.

No entanto, nem tudo está perdido. Consulte Como selecionar um subconjunto de colunas de um procedimento armazenado se desejar menos colunas do que o procedimento retorna.