Няма добри начини за това. Това е ограничение на съхранените процедури. Вашите опции са:
-
Превключете процедурата към дефинирана от потребителя функция . По целия свят днес хората правят съхранени процедури, които трябва да бъдат функции. Това е въпрос на образование. Вашата ситуация е добър пример защо. Ако вашата процедура беше вместо UDF, можете просто да направите следното, точно както интуитивно смятате, че трябва да можете:
SELECT * FROM udf_who2() WHERE login='bmccormack'
-
Ако наистина не можете да докоснете процедурата си, атрябва направете това в sql, тогава ще трябва да станете фънки. Направете друга съхранена процедура, за да обвиете оригиналната си процедура. Във вашата нова процедура извикайте съществуващата си процедура и поставете стойностите във временна таблица, след което изпълнява заявка към тази таблица с филтъра, който искате, и връща този резултат на външния свят.
Започвайки с SQL сървър 2005, дефинираните от потребителя функции са начинът, по който капсулирате извличането на данни. Съхранените процедури, заедно с изгледите, са специални инструменти за използване в определени ситуации. И двете са много удобни в точния момент, но не са първият избор. Някои може да си помислят, че горният пример (A) получава всички резултати от функцията и след това (B) филтрира този набор от резултати, като подзаявка. Това не е така . SQL сървър 2005+ оптимизира тази заявка; ако има индекс на login
, не виждате сканиране на таблица в плана за изпълнение на заявката; много ефективен.
Редактиране :Трябва да добавя, че вътрешностите на UDF са подобни на тези на SP. Ако се забърква с логиката на SP, който искате да избегнете, все още можете да го промените на функция. Няколко пъти съм вземал код на големи, страшни процедури, който не исках да разбирам, и успешно съм го прехвърлял към функция. Единственият проблем ще бъде, ако процедурата се промени нещо в допълнение към връщането на резултати; UDF не могат да променят данни в db.