Neexistují žádné dobré způsoby, jak to udělat. Je to omezení uložených procedur. Vaše možnosti jsou:
-
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'
-
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.