Uczę się funkcji i procedury składowanej od dłuższego czasu, ale nie wiem, dlaczego i kiedy powinienem użyć funkcji lub procedury składowanej. Dla mnie wyglądają tak samo, może dlatego, że jestem trochę początkujący.
Czy ktoś może mi powiedzieć dlaczego?
Odpowiedzi:
Funkcje są wartościami obliczonymi i nie mogą dokonywać trwałych zmian środowiskowych w
SQL Server
(tzn. Nie wolnoINSERT
lub nieUPDATE
zezwala się na instrukcje).Funkcja może być używana w
SQL
instrukcjach, jeśli zwraca wartość skalarną, lub może zostać dołączona, jeśli zwraca zestaw wyników.Warto zwrócić uwagę na komentarze, które podsumowują odpowiedź. Dzięki @Sean K Anderson:
Jak wywołać
SQL
funkcję z procedury składowania i kiedy używamy funkcji zamiast procedury składowanej.Cześć przyjaciele, dzisiaj omówimy Kiedy używać procedury składowanej i kiedy korzystać z funkcji. W prostym zespole Jeśli chcesz obliczyć niektóre wartości, a to zwróci jedną wartość, więc nie jest to wymagane:
https://programmingtechtutorial.blogspot.com/2020/01/when-use-storeprocedure-and-when-use.html
źródło
Różnica między SP a UDF jest wymieniona poniżej:
źródło
Funkcje i procedury przechowywane służą odrębnym celom. Chociaż nie jest to najlepsza analogia, funkcje można postrzegać dosłownie jak każdą inną funkcję, której można by użyć w dowolnym języku programowania, ale przechowywane procy przypominają raczej poszczególne programy lub skrypt wsadowy.
Funkcje zwykle mają wyjście i opcjonalnie wejścia. Dane wyjściowe można następnie wykorzystać jako dane wejściowe do innej funkcji (wbudowany SQL Server, taki jak DATEDIFF, LEN itp.) Lub jako predykat do zapytania SQL - np .
SELECT a, b, dbo.MyFunction(c) FROM table
LubSELECT a, b, c FROM table WHERE a = dbo.MyFunc(c)
.Przechowywane procy są używane do łączenia zapytań SQL w transakcji i interfejsu ze światem zewnętrznym. Frameworki takie jak ADO.NET itp. Nie mogą bezpośrednio wywoływać funkcji, ale mogą bezpośrednio wywoływać przechowywany proc.
Funkcje mają jednak ukryte niebezpieczeństwo: mogą być niewłaściwie używane i powodować dość nieprzyjemne problemy z wydajnością: rozważ to zapytanie:
Gdzie MyFunction jest zadeklarowane jako:
Tutaj dzieje się tak, że funkcja MyFunction jest wywoływana dla każdego wiersza w tabeli MyTable. Jeśli MyTable ma 1000 wierszy, to kolejne 1000 zapytań ad-hoc względem bazy danych. Podobnie, jeśli funkcja jest wywoływana, gdy jest określona w specyfikacji kolumny, funkcja będzie wywoływana dla każdego wiersza zwróconego przez WYBÓR.
Musisz więc uważnie pisać funkcje. Jeśli wybierzesz opcję WYBIERZ z tabeli w funkcji, musisz zadać sobie pytanie, czy można ją lepiej wykonać za pomocą JOIN w nadrzędnym przechowywanym proc lub jakimś innym konstrukcie SQL (takim jak CASE ... WHEN ... ELSE ... KONIEC).
źródło
SELECT * from dbo.MyTableValuedFunction()
. Z drugiej strony Sprocs można wywoływać bezpośrednio za pomocą ADO.NET, ustawiającSqlCommand.CommandType
naCommandType.StoredProcedure
.Różnice między procedurami przechowywanymi a funkcjami zdefiniowanymi przez użytkownika:
RAISEERROR
LUB@@ERROR
nie są dozwolone w UDF.GETDATE()
nie można go używać w UDF.źródło
GETDATE()
może być użyty w funkcji. Punkt zwrotny w przypadku niedeterministycznego nie jest dobry.Napisz funkcję zdefiniowaną przez użytkownika, gdy chcesz obliczyć i zwróć wartość do użycia w innych instrukcjach SQL; napisz procedurę składowaną, kiedy chcesz zamiast tego zgrupować możliwie złożony zestaw instrukcji SQL. W końcu są to dwa zupełnie różne przypadki użycia!
źródło
źródło
Podstawowa różnica
Funkcja musi zwracać wartość, ale w procedurze przechowywanej jest opcjonalna (procedura może zwracać zero lub n wartości).
Funkcje mogą mieć tylko parametry wejściowe, podczas gdy procedury mogą mieć parametry wejściowe / wyjściowe.
Funkcja przyjmuje jeden parametr wejściowy, jest to obowiązkowe, ale procedura składowana może przyjąć do n parametrów wejściowych.
Funkcje można wywoływać z procedury, podczas gdy procedury nie można wywoływać z funkcji.
Różnica zaliczek
Procedura pozwala na użycie instrukcji SELECT oraz DML (INSERT / UPDATE / DELETE), podczas gdy funkcja pozwala na użycie tylko instrukcji SELECT.
Procedury nie mogą być użyte w instrukcji SELECT, natomiast funkcja może być osadzona w instrukcji SELECT.
Procedur przechowywanych nie można używać w instrukcjach SQL w żadnym miejscu sekcji WHERE / HAVING / SELECT, podczas gdy funkcja może być.
Funkcje zwracające tabele można traktować jako inny zestaw wierszy. Można tego użyć w połączeniach z innymi tabelami.
Funkcja Inline może być traktowana jako widoki, które przyjmują parametry i mogą być używane w połączeniach JOIN i innych operacjach zestawu wierszy.
Wyjątek może być obsługiwany przez blok try-catch w procedurze, podczas gdy blok try-catch nie może być używany w funkcji.
Możemy przejść do zarządzania transakcjami w procedurze, podczas gdy nie możemy przejść do funkcji.
źródło
źródło
Returns
słowa kluczowego i musi być typu skalarnego lub tabelowego) , ale Procedury składowane mogą opcjonalnie zwrócić: a)Int
Kod wyniku 1 typu za pomocąReturn
instrukcji i / lub b) Parametry 1+ (w tymCursor
typ) za pomocąOutput
słowa kluczowego i / lub c) Zestawy rzędu 1+ za pomocąSelect
instrukcji. jest zwracany, można go użyć jako argumentu „execute_statement” instrukcji „Insert Into”.funkcja zdefiniowana przez użytkownika jest ważnym narzędziem dostępnym dla programisty serwera SQL. Możesz użyć go wbudowanego w takiej instrukcji SQL
gdzie
lookupValue
będzie UDF. Tego rodzaju funkcjonalność nie jest możliwa przy użyciu procedury składowanej. Jednocześnie nie można wykonywać pewnych czynności w UDF. Podstawową rzeczą do zapamiętania jest to, że UDF:procedura składowana może robić te rzeczy.
Dla mnie bezpośrednie użycie UDF jest najważniejszym użyciem UDF.
źródło
Procedury przechowywane są używane jako skrypty . Wykonują dla ciebie serię poleceń i możesz zaplanować ich uruchomienie w określonych godzinach. Zwykle uruchamia wiele instrukcji DML, takich jak INSERT, UPDATE, DELETE itp., A nawet SELECT.
Funkcje są używane jako metody. Podajesz coś, a zwraca wynik. Powinien być mały i szybki - robi to w locie. Zwykle używany w instrukcji SELECT.
źródło
Procedura składowana:
EXEC
lubEXECUTE
instrukcji.OUT
parametru.Funkcjonować:
Można go używać tylko do wybierania rekordów. Można go jednak bardzo łatwo wywołać ze standardowego SQL, na przykład:
lub
W przypadku prostych operacji wyboru wielokrotnego użytku funkcje mogą uprościć kod. Uważaj tylko na użycie
JOIN
klauzul w swoich funkcjach. Jeśli twoja funkcja maJOIN
klauzulę i wywołujesz ją z innej instrukcji select, która zwraca wiele wyników, to wywołanie funkcji spowoduje utworzenieJOIN
tych tabel razem dla każdej linii zwróconej w zestawie wyników. Więc chociaż mogą być pomocne w uproszczeniu logiki, mogą również stanowić wąskie gardło wydajności, jeśli nie są właściwie używane.OUT
parametru.źródło
Funkcja zdefiniowana przez użytkownika.
Procedura składowana
źródło
Aby zdecydować, kiedy użyć, co mogą pomóc następujące punkty:
Procedury składowane nie mogą zwrócić zmiennej tabeli, w której funkcja może to zrobić.
Możesz użyć procedur składowanych, aby zmienić parametry środowiska serwera, w przypadku których nie możesz używać funkcji.
Twoje zdrowie
źródło
Funkcje programu SQL Server, takie jak kursory, mają być używane jako ostatnia broń! Mają problemy z wydajnością, dlatego należy w jak największym stopniu unikać korzystania z funkcji wycenianej w tabeli. Mówienie o wydajności mówi o stole z ponad 1 000 000 rekordów hostowanych na serwerze na sprzęcie klasy średniej; w przeciwnym razie nie musisz się martwić spadkiem wydajności spowodowanym przez funkcje.
w celu uzyskania dalszych informacji patrz: http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html
źródło
Zacznij od funkcji, które zwracają jedną wartość. Zaletą jest to, że możesz umieścić często używany kod w funkcji i zwrócić je jako kolumnę w zestawie wyników.
Następnie możesz użyć funkcji do sparametryzowanej listy miast. dbo.GetCitiesIn („NY”) Zwraca tabelę, która może być używana jako łączenie.
To sposób organizacji kodu. Wiedząc, kiedy coś można ponownie wykorzystać, a kiedy jest to strata czasu, uzyskuje się jedynie dzięki próbom, błędom i doświadczeniu.
Również funkcje są dobrym pomysłem w SQL Server. Są szybsze i mogą być dość potężne. Zaznaczenia wbudowane i bezpośrednie. Uważaj, aby nie nadużywać.
źródło
Oto praktyczny powód, aby preferować funkcje nad procedurami przechowywanymi. Jeśli masz procedurę składowaną, która wymaga wyników innej procedury składowanej, musisz użyć instrukcji insert-exec. Oznacza to, że musisz utworzyć tabelę tymczasową i użyć
exec
instrukcji, aby wstawić wyniki procedury składowanej do tabeli tymczasowej. To jest niechlujne. Jednym z problemów jest to, że insert-execs nie mogą być zagnieżdżone .Jeśli utkniesz w procedurach przechowywanych wywołujących inne procedury przechowywane, możesz na to natknąć. Jeśli zagnieżdżona procedura przechowywana po prostu zwraca zestaw danych, można go zastąpić funkcją o wartości tabeli i nie będzie już tego błędu.
( jest to kolejny powód, dla którego powinniśmy trzymać logikę biznesową poza bazą danych )
źródło
źródło
Funkcje mogą być używane w instrukcji select, gdy procedury nie mogą.
Procedura składowana przyjmuje parametry wejściowe i wyjściowe, ale Funkcje tylko parametry wejściowe.
Funkcje nie mogą zwracać wartości typu tekst, ntext, obraz i znaczniki czasu, o ile procedury mogą.
Funkcje mogą być używane jako typy danych zdefiniowane przez użytkownika w tworzeniu tabeli, ale procedury nie.
*** Np .: -tworzyć
table <tablename>(name varchar(10),salary getsal(name))
W tym przypadku getsal jest funkcją zdefiniowaną przez użytkownika, która zwraca typ wynagrodzenia, gdy tworzona jest tabela, nie jest przydzielane miejsce na typ wynagrodzenia, a funkcja getsal również nie jest wykonywana, ale gdy pobieramy niektóre wartości z tej tabeli, funkcja getsal zostaje wykonana, a return Typ jest zwracany jako zestaw wyników.
źródło
Zdaję sobie sprawę, że to bardzo stare pytanie, ale nie widzę żadnego ważnego aspektu wspomnianego w żadnej z odpowiedzi: wpisania się w plan zapytań.
Funkcje mogą być ...
Skalarny:
CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END
Tabela z wieloma wyciągami:
CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END
Inline wyceniany w tabeli:
CREATE FUNCTION ... RETURNS TABLE AS RETURN SELECT ...
Trzeci rodzaj (wstawiany do tabeli) jest traktowany przez optymalizator zapytań zasadniczo jako widoki (sparametryzowane), co oznacza, że odwoływanie się do funkcji z zapytania jest podobne do wklejania kopii kodu SQL funkcji (bez faktycznego wklejania kopii), prowadząc do następujących korzyści:
Powyższe może prowadzić do potencjalnie znacznych oszczędności wydajności, szczególnie w przypadku łączenia wielu poziomów funkcji.
UWAGA: Wygląda na to, że SQL Server 2019 wprowadzi również pewną formę wbudowania funkcji skalarnej .
źródło
W SQL Server funkcje i procedura przechowywana są dwoma różnymi typami jednostek.
Funkcja: W bazie danych SQL Server funkcje są używane do wykonywania niektórych akcji, a akcja natychmiast zwraca wynik. Funkcje są dwa typy:
System zdefiniowany
Zdefiniowane przez użytkownika
Procedury przechowywane: W SQL Server procedury przechowywane są przechowywane na serwerze i mogą być zwracane zero, pojedyncze i wielokrotne wartości. Procedury przechowywane są dwa typy:
źródło