sql >> Databasteknik >  >> RDS >> Sqlserver

Använd SQL för att filtrera resultaten av en lagrad procedur

Det finns inga bra sätt att göra det på. Det är en begränsning av lagrade procedurer. Dina alternativ är:

  1. Byt proceduren till en användardefinierad funktion . Över hela världen, idag, gör människor lagrade procedurer som borde vara funktioner. Det är en utbildningsfråga. Din situation är ett bra exempel på varför. Om din procedur istället var en UDF kunde du bara göra följande, precis som du intuitivt tror att du borde kunna:

    SELECT * FROM udf_who2()
    WHERE login='bmccormack'
    
  2. Om du verkligen inte kan röra din procedur och måste gör detta i sql, då måste du bli skraj. Gör en annan lagrad procedur för att slå in din ursprungliga procedur. Inuti din nya procedur ring din befintliga procedur och lägg in värdena i en temporär tabell, kör sedan en fråga mot den tabellen med det filter du vill ha och returnerar resultatet till omvärlden.

Från och med SQL Server 2005 är användardefinierade funktioner hur du kapslar in datahämtning. Lagrade procedurer, tillsammans med vyer, är specialverktyg att använda i särskilda situationer. De är båda väldigt praktiska vid rätt tillfälle, men inte förstahandsvalet. Vissa kanske tror att exemplet ovan (A) får alla resultat av funktionen och sedan (B) filtrerar på den resultatuppsättningen, som en underfråga. Detta är inte fallet . SQL server 2005+ optimerar den frågan; om det finns ett index på login , ser du inte en tabellsökning i frågeexekveringsplanen; mycket effektivt.

Redigera :Jag bör tillägga att insidan av en UDF liknar den hos en SP. Om det krånglar med logiken av den SP som du vill undvika kan du fortfarande ändra den till en funktion. Flera gånger har jag tagit stor, skrämmande processkod som jag inte velat behöva förstå, och framgångsrikt överfört den till en funktion. Det enda problemet kommer att vara om proceduren ändras allt utöver att returnera resultat; UDF:er kan inte ändra data i db.



  1. PHP &MySQL-funktion tar bort omarkerade kategorier från databasproblem

  2. summan av den högsta händelsen i följd

  3. Ordning efter specifikt fältvärde först

  4. PostgreSQL släppbegränsning med okänt namn