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.