Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Użyj SQL do filtrowania wyników procedury składowanej

Nie ma na to dobrych sposobów. Jest to ograniczenie procedur składowanych. Twoje opcje to:

  1. Zmień procedurę na funkcję zdefiniowaną przez użytkownika . Obecnie na całym świecie ludzie tworzą procedury składowane, które powinny być funkcjami. To kwestia edukacji. Twoja sytuacja jest dobrym przykładem dlaczego. Gdyby twoja procedura była zamiast UDF, możesz po prostu wykonać następujące czynności, dokładnie tak, jak intuicyjnie uważasz, że powinieneś być w stanie:

    SELECT * FROM udf_who2()
    WHERE login='bmccormack'
    
  2. Jeśli naprawdę nie możesz dotknąć swojej procedury i musisz zrobić to w sql, wtedy będziesz musiał być funky. Utwórz inną procedurę składowaną, aby zawinąć oryginalną procedurę. Wewnątrz nowej procedury wywołaj istniejącą procedurę i umieść wartości w tabeli tymczasowej, a następnie uruchom zapytanie względem tej tabeli z żądanym filtrem i zwróć ten wynik do świata zewnętrznego.

Począwszy od SQL Server 2005, funkcje zdefiniowane przez użytkownika służą do hermetyzacji pobierania danych. Procedury składowane wraz z widokami to specjalistyczne narzędzia do użycia w określonych sytuacjach. Oba są bardzo przydatne we właściwym czasie, ale nie są pierwszym wyborem. Niektórzy mogą pomyśleć, że powyższy przykład (A) pobiera wszystkie wyniki funkcji, a następnie (B) filtruje ten zbiór wyników, jak podzapytanie. Tak nie jest . SQL Server 2005+ optymalizuje to zapytanie; jeśli istnieje indeks na login , nie widzisz skanu tabeli w planie wykonania zapytania; bardzo wydajny.

Edytuj :Powinienem dodać, że wnętrzności UDF są podobne do SP. Jeśli nie zgadza się z logiką SP, którego chcesz uniknąć, nadal możesz zmienić go na funkcję. Kilka razy wziąłem duży, przerażający kod procedur, którego nie chciałem rozumieć, i pomyślnie przeniosłem go do funkcji. Jedynym problemem będzie to, że procedura zmienia się cokolwiek oprócz zwracania wyników; UDF nie mogą modyfikować danych w 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. Nie można połączyć się z SQL Server 2008 przy użyciu połączenia ODBC przez system dsn w systemie Windows 2012

  2. Częściowe słowa w dowolnym tekście na serwerze SQL

  3. Mam tabelę tagów. Jak wstawić zbiorczo za pomocą LINQ?

  4. Jak mogę użyć instrukcji if po CTE (SQL Server 2005)

  5. Jak zwiększyć maksymalny dozwolony rozmiar załącznika dla wiadomości e-mail wysyłanych przy użyciu msdb.dbo.sp_send_dbmail w programie Microsoft SQL Server 2005/2008