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

Utiliser SQL pour filtrer les résultats d'une procédure stockée

Il n'y a pas de bonnes façons de le faire. C'est une limitation des procédures stockées. Vos options sont :

  1. Passez la procédure à une Fonction définie par l'utilisateur . Partout dans le monde, aujourd'hui, les gens créent des procédures stockées qui devraient être des fonctions. C'est une question d'éducation. Votre situation est un bon exemple pourquoi. Si votre procédure était plutôt une UDF, vous pourriez simplement faire ce qui suit, exactement comme vous pensez intuitivement que vous devriez être capable de :

    SELECT * FROM udf_who2()
    WHERE login='bmccormack'
    
  2. Si vous ne pouvez vraiment pas toucher à votre procédure, et devez faites cela en sql, alors vous devrez devenir funky. Créez une autre procédure stockée pour envelopper votre procédure d'origine. Dans votre nouvelle procédure, appelez votre procédure existante et placez les valeurs dans une table temporaire, puis exécutez une requête sur cette table avec le filtre souhaité et renvoyez ce résultat au monde extérieur.

Depuis SQL Server 2005, les fonctions définies par l'utilisateur permettent d'encapsuler la récupération des données. Les procédures stockées, ainsi que les vues, sont des outils spécialisés à utiliser dans des situations particulières. Ils sont tous les deux très pratiques au bon moment, mais pas le premier choix. Certains pourraient penser que l'exemple ci-dessus (A) obtient tous les résultats de la fonction, puis (B) filtre sur cet ensemble de résultats, comme une sous-requête. Ce n'est pas le cas . SQL Server 2005+ optimise cette requête; s'il y a un index sur login , vous ne voyez pas de balayage de table dans le plan d'exécution de la requête ; très efficace.

Modifier :Je dois ajouter que les entrailles d'un UDF sont similaires à celles d'un SP. Si ça dérange la logique du SP que vous voulez éviter, vous pouvez toujours le changer en fonction. Plusieurs fois, j'ai pris un code de procédures volumineux et effrayant que je ne voulais pas avoir à comprendre, et je l'ai transféré avec succès dans une fonction. Le seul problème sera si la procédure modifie quoi que ce soit en plus de renvoyer des résultats ; Les UDF ne peuvent pas modifier les données dans la base de données.