sql >> Databáze >  >> RDS >> Sqlserver

Pomocí SQL filtrujte výsledky uložené procedury

Neexistují žádné dobré způsoby, jak to udělat. Je to omezení uložených procedur. Vaše možnosti jsou:

  1. Přepněte postup na Uživatelem definovanou funkci . Po celém světě dnes lidé vytvářejí uložené procedury, které by měly být funkcemi. Je to otázka vzdělávání. Vaše situace je dobrým příkladem proč. Pokud by byl váš postup místo toho UDF, mohli byste udělat následující, přesně tak, jak si intuitivně myslíte, že byste měli být schopni:

    SELECT * FROM udf_who2()
    WHERE login='bmccormack'
    
  2. Pokud se svého postupu opravdu nemůžete dotknout a musíte mít to udělat v SQL, pak budete muset dostat funky. Vytvořte jinou uloženou proceduru, která zalomí původní proceduru. Uvnitř své nové procedury zavolejte svou stávající proceduru a vložte hodnoty do dočasné tabulky, poté spustíte dotaz proti této tabulce s požadovaným filtrem a vrátíte výsledek do vnějšího světa.

Počínaje SQL serverem 2005 jsou načítání dat zapouzdřeny uživatelsky definovanými funkcemi. Uložené procedury jsou spolu s pohledy speciálními nástroji pro použití v konkrétních situacích. Oba jsou velmi šikovní ve správný čas, ale nejsou první volbou. Někdo by si mohl myslet, že výše uvedený příklad (A) získá všechny výsledky funkce a poté (B) filtruje tuto sadu výsledků, jako je poddotaz. Toto není tento případ . SQL server 2005+ optimalizuje tento dotaz; pokud je na login index , nevidíte skenování tabulky v plánu provádění dotazu; velmi efektivní.

Upravit :Měl bych dodat, že vnitřnosti UDF jsou podobné jako u SP. Pokud si to zahrává s logikou SP, kterému se chcete vyhnout, stále jej můžete změnit na funkci. Několikrát jsem vzal velký, děsivý kód procedur, kterému jsem nechtěl rozumět, a úspěšně jsem ho převedl do funkce. Jediný problém bude, pokud se postup upraví cokoliv kromě vracení výsledků; UDF nemohou upravovat data v db.



  1. PostgreSQL 9.1:Jak zřetězit řádky v poli bez duplikátů, PŘIPOJTE SE k jiné tabulce

  2. Dvojité uvozovky v názvu tabulky ve vybraném dotazu PostgreSQL

  3. EXISTS vs JOIN a použití klauzule EXISTS

  4. Jak mohu vytvořit tabulku jako výběr z jiné databáze v Oracle?