Er zijn geen goede manieren om dat te doen. Het is een beperking van opgeslagen procedures. Uw opties zijn:
-
Schakel de procedure over naar een Door de gebruiker gedefinieerde functie . Over de hele wereld maken mensen tegenwoordig opgeslagen procedures die functies zouden moeten zijn. Het is een opvoedingskwestie. Jouw situatie is een goed voorbeeld waarom. Als uw procedure in plaats daarvan een UDF was, zou u het volgende kunnen doen, precies zoals u intuïtief denkt dat u zou moeten kunnen:
SELECT * FROM udf_who2() WHERE login='bmccormack'
-
Als u uw procedure echt niet kunt aanraken, en moet als je dit in sql hebt gedaan, dan moet je funky worden. Maak nog een opgeslagen procedure om uw oorspronkelijke procedure in te pakken. Roep in uw nieuwe procedure uw bestaande procedure aan en plaats de waarden in een tijdelijke tabel, voer vervolgens een query uit op die tabel met het gewenste filter en stuur dat resultaat terug naar de buitenwereld.
Vanaf SQL server 2005 zijn door de gebruiker gedefinieerde functies de manier waarop u het ophalen van gegevens inkapselt. Opgeslagen procedures, samen met weergaven, zijn speciale hulpmiddelen om in bepaalde situaties te gebruiken. Ze zijn allebei erg handig op het juiste moment, maar niet de eerste keuze. Sommigen denken misschien dat het bovenstaande voorbeeld (A) alle resultaten van de functie krijgt en vervolgens (B) op die resultatenset filtert, zoals een subquery. Dit is niet het geval . SQL server 2005+ optimaliseert die query; als er een index is op login
, u ziet geen tabelscan in het uitvoeringsplan voor query's; zeer efficiënt.
Bewerken :Ik moet hieraan toevoegen dat de ingewanden van een UDF vergelijkbaar zijn met die van een SP. Als het knoeit met de logica van de SP die u wilt vermijden, kunt u deze nog steeds wijzigen in een functie. Meerdere keren heb ik grote, enge procedurecode genomen die ik niet wilde begrijpen, en met succes overgebracht naar een functie. Het enige probleem zal zijn als de procedure aanpast alles behalve het retourneren van resultaten; UDF's kunnen geen gegevens in de db wijzigen.