Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Използвайте SQL, за да филтрирате резултатите от съхранена процедура

Няма добри начини за това. Това е ограничение на съхранените процедури. Вашите опции са:

  1. Превключете процедурата към дефинирана от потребителя функция . По целия свят днес хората правят съхранени процедури, които трябва да бъдат функции. Това е въпрос на образование. Вашата ситуация е добър пример защо. Ако вашата процедура беше вместо UDF, можете просто да направите следното, точно както интуитивно смятате, че трябва да можете:

    SELECT * FROM udf_who2()
    WHERE login='bmccormack'
    
  2. Ако наистина не можете да докоснете процедурата си, атрябва направете това в sql, тогава ще трябва да станете фънки. Направете друга съхранена процедура, за да обвиете оригиналната си процедура. Във вашата нова процедура извикайте съществуващата си процедура и поставете стойностите във временна таблица, след което изпълнява заявка към тази таблица с филтъра, който искате, и връща този резултат на външния свят.

Започвайки с SQL сървър 2005, дефинираните от потребителя функции са начинът, по който капсулирате извличането на данни. Съхранените процедури, заедно с изгледите, са специални инструменти за използване в определени ситуации. И двете са много удобни в точния момент, но не са първият избор. Някои може да си помислят, че горният пример (A) получава всички резултати от функцията и след това (B) филтрира този набор от резултати, като подзаявка. Това не е така . SQL сървър 2005+ оптимизира тази заявка; ако има индекс на login , не виждате сканиране на таблица в плана за изпълнение на заявката; много ефективен.

Редактиране :Трябва да добавя, че вътрешностите на UDF са подобни на тези на SP. Ако се забърква с логиката на SP, който искате да избегнете, все още можете да го промените на функция. Няколко пъти съм вземал код на големи, страшни процедури, който не исках да разбирам, и успешно съм го прехвърлял към функция. Единственият проблем ще бъде, ако процедурата се промени нещо в допълнение към връщането на резултати; UDF не могат да променят данни в db.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server dbo.sysdiagrams е потребителска таблица или системна таблица

  2. Entity Framework:Метод Database.ExecuteSqlCommand

  3. RODBC odbcDriverConnect() Грешка при свързване

  4. Отлагаеми ограничения в SQL Server

  5. Как индексът на пълен текст на SQL Server всъщност индексира думите в каталог?