sql >> Database teknologi >  >> RDS >> Sqlserver

Brug SQL til at filtrere resultaterne af en lagret procedure

Der er ingen gode måder at gøre det på. Det er en begrænsning af lagrede procedurer. Dine muligheder er:

  1. Skift proceduren til en Brugerdefineret funktion . Over hele verden laver folk i dag lagrede procedurer, der burde være funktioner. Det er et uddannelsesspørgsmål. Din situation er et godt eksempel på hvorfor. Hvis din procedure i stedet var en UDF, kunne du bare gøre følgende, præcis som du intuitivt tror, ​​du burde være i stand til:

    SELECT * FROM udf_who2()
    WHERE login='bmccormack'
    
  2. Hvis du virkelig ikke kan røre din procedure, og skal har dette gjort i sql, så bliver du nødt til at blive funky. Lav en anden gemt procedure for at pakke din originale procedure ind. Inde i din nye procedure kald din eksisterende procedure og sæt værdierne i en midlertidig tabel, kør derefter en forespørgsel mod den tabel med det filter, du ønsker, og returner resultatet til omverdenen.

Fra og med SQL Server 2005 er brugerdefinerede funktioner, hvordan du indkapsler datahentning. Lagrede procedurer er sammen med visninger specialværktøjer til brug i særlige situationer. De er begge meget handy på det rigtige tidspunkt, men ikke det første valg. Nogle vil måske tro, at ovenstående eksempel (A) får alle resultaterne af funktionen og derefter (B) filtrerer på det resultatsæt, som en underforespørgsel. Dette er ikke tilfældet . SQL server 2005+ optimerer denne forespørgsel; hvis der er et indeks på login , ser du ikke en tabelscanning i forespørgselsudførelsesplanen; meget effektiv.

Rediger :Jeg skal tilføje, at indmaden i en UDF ligner den af ​​en SP. Hvis det roder med logikken af den SP, som du vil undgå, kan du stadig ændre den til en funktion. Flere gange har jeg taget stor, skræmmende procedurekode, som jeg ikke ønskede at skulle forstå, og med succes overført den til en funktion. Det eneste problem vil være, hvis proceduren ændrer alt ud over at returnere resultater; UDF'er kan ikke ændre data i db.



  1. Undgå Database Vendor Lock-In til MySQL eller MariaDB

  2. ORA-08177:kan ikke serialisere adgang til denne transaktion

  3. Ændre MySQL standardtegnsæt til UTF-8 i my.cnf?

  4. Returner rækker, hvor kolonnen matcher alle værdier i et sæt