Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment sélectionner un sous-ensemble de colonnes dans l'ensemble de résultats d'une procédure stockée (T-SQL)

Avez-vous déjà exécuté une procédure stockée, seulement pour être submergé par le nombre de colonnes renvoyées ? Peut-être que vous n'aviez besoin que d'une ou deux colonnes, mais cela vous a présenté moyen trop de colonnes pour vos besoins à cette occasion particulière.

Heureusement, il existe une petite astuce que vous pouvez utiliser pour récupérer les colonnes sélectionnées à partir d'une procédure stockée. Cela vous permet d'obtenir uniquement les colonnes dont vous avez besoin.

Et le meilleur, c'est que cela n'implique pas d'avoir à créer des tables temporaires et à mélanger les données.

Tout ce que vous avez à faire est de passer votre procédure stockée au OPENROWSET() une fonction.

Le même concept peut être appliqué à OPENQUERY() fonction.

Exemple

Prenez les sp_columns procédure stockée système par exemple. Il renvoie 19 colonnes.

EXEC sp_columns Cats; 

Résultat :

+------------------+---------------+---------- ----+---------------+-------------+-------------+ -------------+----------+---------+---------+----- -------+-----------+-------------+--------------- --+--------------------+---------------------+---- ----------------+---------------+----------------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRÉCISION | LONGUEUR | ÉCHELLE | BASE | NULLABLE | REMARQUES | COLONNE_DEF | SQL_DATA_TYPE | SQL_DATETIME_SUB | CHAR_OCTET_LENGTH | ORDINAL_POSITION | IS_NULLABLE | SS_DATA_TYPE ||-------------------+---------------+----------- ---+---------------+-------------+-------------+- ------------+----------+---------+---------+------ ------+-----------+-------------+----------- -+--------------------+---------------------+----- ---------------+---------------+----------------|| Animaux de compagnie | dbo | Chats | ID de chat | 4 | entier identité | 10 | 4 | 0 | 10 | 0 | NUL | NUL | 4 | NUL | NUL | 1 | NON | 56 || Animaux de compagnie | dbo | Chats | NomChat | 12 | varchar | 60 | 60 | NUL | NUL | 1 | NUL | NUL | 12 | NUL | 60 | 2 | OUI | 39 |+------------------+---------------+----------- ---+---------------+-------------+-------------+- ------------+----------+---------+---------+------ ------+-----------+-------------+----------- -+--------------------+---------------------+----- ---------------+---------------+----------------+ 

Des procédures comme celle-ci nous obligent souvent à faire défiler latéralement dans une chasse aux oies sauvages pour trouver les colonnes qui nous intéressent.

Peut-être voulons-nous simplement voir 4 colonnes spécifiques au lieu des 19.

Nous pouvons exécuter la requête suivante pour faire exactement cela.

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; 

Résultat :

+---------------+-------------+-------------+- ---------+| COLUMN_NAME | TYPE_NAME | PRÉCISION | LONGUEUR ||---------------+-------------+-------------+-- --------|| ID de chat | entier identité | 10 | 4 || NomChat | varchar | 60 | 60 |+---------------+-------------+-------------+-- --------+

Le OPENROWSET() fonction a été conçue principalement pour récupérer des données distantes, mais vous pouvez également l'utiliser sur l'instance locale, en spécifiant localhost dans la chaîne de connexion (comme je l'ai fait dans cet exemple).

La fonction OPENQUERY()

Comme mentionné, le même concept peut être appliqué à OPENQUERY() fonction.

SELECT 
    c.COLUMN_NAME,
    c.TYPE_NAME,
    c.PRECISION,
    c.LENGTH
FROM OPENQUERY(
    Homer,
    'EXEC Pets.dbo.sp_columns Cats'
    ) c; 

Résultat :

+---------------+-------------+-------------+- ---------+| COLUMN_NAME | TYPE_NAME | PRÉCISION | LONGUEUR ||---------------+-------------+-------------+-- --------|| ID de chat | entier identité | 10 | 4 || NomChat | varchar | 60 | 60 |+---------------+-------------+-------------+-- --------+

Dans ce cas, j'ai spécifié un serveur lié appelé Homer au lieu du serveur local.

Si vous obtenez une erreur indiquant "Le serveur n'est pas configuré pour l'ACCÈS AUX DONNÉES", vous devrez activer l'accès aux données pour le serveur, même si vous interrogez votre instance locale. Voir Comment activer/désactiver l'accès aux données pour savoir comment procéder.