499 votes

Sélectionnez les colonnes du jeu de résultats de la procédure stockée

J'ai une procédure stockée qui renvoie à 80 colonnes, et de 300 lignes. Je veux écrire une sélection qui obtient 2 de ces colonnes. Quelque chose comme

SELECT col1, col2 FROM EXEC MyStoredProc 'param1', 'param2'

Lorsque j'ai utilisé la syntaxe ci-dessus, j'obtiens le message d'erreur "Nom de Colonne non Valide".

Je sais que la solution la plus simple serait de modifier la procédure stockée, mais je n'ai pas l'écrire, et je ne peux pas le changer.

est-il possible de faire ce que je veux?

  • J'ai pu faire une table temp de mettre les résultats, mais parce qu'il y a 80 colonnes, donc j'aurais besoin de faire un 80 colonnes de la table temporaire juste pour obtenir 2 colonnes. Je voulais éviter la traque de toutes les colonnes qui sont retournés.

  • J'ai essayé d'utiliser WITH SprocResults AS .... , comme proposé par la Marque, mais j'ai eu 2 erreurs

    Syntaxe incorrecte près du mot clé "EXEC".
    Syntaxe incorrecte près de ')'.

  • J'ai essayé de déclarer une variable de table et j'ai obtenu l'erreur suivante

    Insérer l'Erreur: nom de la Colonne ou le nombre de valeurs fournies ne correspondent pas à la définition de la table

  • Si j'essaie
    SELECT * FROM EXEC MyStoredProc 'param1', 'param2'
    J'obtiens l'erreur :

    Syntaxe incorrecte près du mot clé "exec".

217voto

Gulzar Nazim Points 35342

Pouvez vous décomposer la requête ? Insérer les résultats de la procédure stockée dans une variable de table ou une table temporaire. Sélectionnez ensuite les 2 colonnes dans la variable de table.

90voto

Lance McNearney Points 6224

Voici un lien vers un très bon document expliquant les différentes façons de résoudre votre problème (bien que beaucoup d'entre eux ne peut pas être utilisé puisque vous ne pouvez pas modifier la procédure stockée existante.)

Comment Partager des Données Entre des Procédures Stockées

Gulzar la réponse de travailler (elle est décrite dans le lien ci-dessus), mais ça va être chiant à écrire (vous aurez besoin de spécifier tous les 80 noms de colonnes dans votre @tablevar(col1,...). Et dans l'avenir si une colonne est ajoutée au schéma ou de la sortie est modifié, il devra être mis à jour dans votre code ou il erreur.

85voto

Peter Nazarov Points 419
<pre><code></code><p>Source :<br> <a href="http://stevesmithblog.com/blog/select-from-a-stored-procedure/">http://stevesmithblog.com/blog/Select-from-a-Stored-Procedure/</a></p></pre>

43voto

Merenzo Points 2117

Cela fonctionne pour moi: (c'est à dire que j'ai seulement besoin de 2 colonnes de l'30+ renvoyé par sp_help_job)

SELECT name, current_execution_status 
FROM OPENQUERY (MYSERVER, 
  'EXEC msdb.dbo.sp_help_job @job_name = ''My Job'', @job_aspect = ''JOB''');  

Avant cela, j'avais besoin pour exécuter ce:

sp_serveroption 'MYSERVER', 'DATA ACCESS', TRUE;

....pour mettre à jour l' sys.servers table. (c'est à dire à l'Aide d'un auto-référence dans OPENQUERY semble être désactivé par défaut.)

Pour mon simple exigence, je n'ai rencontré aucun des problèmes décrits dans la OPENQUERY section de Lance de l'excellent lien.

Rossini, si vous avez besoin de définir de manière dynamique les paramètres, l'utilisation de OPENQUERY devient un peu plus délicat:

DECLARE @innerSql varchar(1000);
DECLARE @outerSql varchar(1000);

-- Set up the original stored proc definition.
SET @innerSql = 
'EXEC msdb.dbo.sp_help_job @job_name = '''+@param1+''', @job_aspect = N'''+@param2+'''' ;

-- Handle quotes.
SET @innerSql = REPLACE(@innerSql, '''', '''''');

-- Set up the OPENQUERY definition.
SET @outerSql = 
'SELECT name, current_execution_status 
FROM OPENQUERY (MYSERVER, ''' + @innerSql + ''');';

-- Execute.
EXEC (@outerSql);

Je ne suis pas sûr de la différence (le cas échéant) entre l'utilisation d' sp_serveroption de mettre à jour l' sys.servers auto-référence directement, au lieu d'utiliser sp_addlinkedserver (comme décrit dans la Lance du lien) pour créer un doublon/alias.

Note 1: Je préfère OPENQUERY sur OPENROWSET, étant donné que OPENQUERY ne nécessite pas la connexion-définition de la chaîne dans le proc.

Note 2: Ayant dit tout cela: normalement, je voudrais juste utiliser INSERT ... EXEC :) Oui, c'est 10 minutes supplémentaires de frappe, mais si je peux aider, je préfère ne pas turlutte autour avec:
(a) les citations dans les citations dans les citations, et
(b) sys tables, et/ou sournois auto-référencement Lié les paramétrages de Serveur (c'est à dire pour ceux-ci, j'ai besoin de plaider mon cas pour nos tout-puissant Administrateurs de base de données :)

Cependant dans ce cas, je ne pouvais pas utiliser un INSERT ... EXEC construire, sp_help_job est déjà à l'aide de l'un. ("Une instruction INSERT EXEC ne peut pas être imbriqués.")

11voto

Brannon Points 12633

(En supposant que SQL Server)

La seule façon de travailler avec les résultats d’une procédure stockée T-SQL est d’utiliser la `` syntaxe. Cela vous donne la possibilité d’insérer dans une table temporaire ou une variable de table et de là en sélectionnant les données dont vous avez besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X