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

Como selecionar um subconjunto de colunas do conjunto de resultados de um procedimento armazenado (T-SQL)


Você já executou um procedimento armazenado, apenas para ficar sobrecarregado com o número de colunas retornadas? Talvez você só precisasse de uma ou duas colunas, mas ela lhe apresentou caminho muitas colunas para suas necessidades nesta ocasião específica.

Felizmente, há um pequeno truque que você pode usar para recuperar colunas selecionadas de um procedimento armazenado. Isso permite que você obtenha apenas as colunas de que precisa.

E a melhor parte é que não envolve ter que criar tabelas temporárias e embaralhar os dados.

Tudo que você precisa fazer é passar seu procedimento armazenado para o OPENROWSET() função.

O mesmo conceito pode ser aplicado ao OPENQUERY() função.

Exemplo


Pegue as sp_columns procedimento armazenado do sistema, por exemplo. Retorna 19 colunas.
EXEC sp_columns Cats; 

Resultado:
+-------------------+---------------+---------- ----+---------------+-------------+----------+ -------------+----------+---------+---------+----- -------+-----------+--------------+--------------- --+--------------------+---------------------+---- -----+---------------+----------------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISÃO | COMPRIMENTO | ESCALA | RADIC | NULO | OBSERVAÇÕES | COLUMN_DEF | SQL_DATA_TYPE | SQL_DATETIME_SUB | CHAR_OCTET_LENGTH | ORDINAL_POSITION | IS_NULLABLE | SS_DATA_TYPE ||-------------------+---------------+----------- ---+---------------+-------------+--------------+- ------------+----------+---------+---------+------ ---+-----------+--------------+---------------- -+--------------------+---------------------+----- ---------------+---------------+----------------|| Animais de estimação | dbo | Gatos | CatId | 4 | identidade int | 10 | 4 | 0 | 10 | 0 | NULO | NULO | 4 | NULO | NULO | 1 | NÃO | 56 || Animais de estimação | dbo | Gatos | CatName | 12 | varchar | 60 | 60 | NULO | NULO | 1 | NULO | NULO | 12 | NULO | 60 | 2 | SIM | 39 |+-------------------+---------------+----------- ---+---------------+-------------+--------------+- ------------+----------+---------+---------+------ ---+-----------+--------------+---------------- -+--------------------+---------------------+----- ---------------+---------------+----------------+ 
Procedimentos como esse geralmente exigem que rolemos para os lados em uma caçada louca para encontrar as colunas nas quais estamos interessados.

Talvez queiramos apenas ver 4 colunas específicas em vez de todas as 19.

Podemos executar a seguinte consulta para fazer exatamente isso.
SELECT 
    c.COLUMN_NAME,
    c.TYPE_NAME,
    c.PRECISION,
    c.LENGTH
FROM OPENROWSET(
    'SQLOLEDB', 
    'SERVER=localhost;Trusted_Connection=yes;', 
    'EXEC Pets.dbo.sp_columns Cats'
    ) c; 

Resultado:
+---------------+--------------+-------------+- ---------+| COLUMN_NAME | TYPE_NAME | PRECISÃO | COMPRIMENTO ||---------------+--------------+-------------+-- --------|| CatId | identidade int | 10 | 4 || CatName | varchar | 60 | 60 |+---------------+--------------+-------------+-- --------+

O OPENROWSET() A função foi projetada principalmente para recuperar dados remotos, mas você também pode usá-la na instância local, especificando localhost na string de conexão (como eu fiz neste exemplo).

A função OPENQUERY()


Como mencionado, o mesmo conceito pode ser aplicado ao OPENQUERY() função.
SELECT 
    c.COLUMN_NAME,
    c.TYPE_NAME,
    c.PRECISION,
    c.LENGTH
FROM OPENQUERY(
    Homer,
    'EXEC Pets.dbo.sp_columns Cats'
    ) c; 

Resultado:
+---------------+--------------+-------------+- ---------+| COLUMN_NAME | TYPE_NAME | PRECISÃO | COMPRIMENTO ||---------------+--------------+-------------+-- --------|| CatId | identidade int | 10 | 4 || CatName | varchar | 60 | 60 |+---------------+--------------+-------------+-- --------+

Nesse caso, especifiquei um servidor vinculado chamado Homer em vez do servidor local.

Se você receber um erro que diz “O servidor não está configurado para ACESSO A DADOS”, você precisará habilitar o acesso a dados para o servidor, mesmo se estiver consultando sua instância local. Consulte Como ativar/desativar o acesso a dados para obter instruções sobre como fazer isso.