Jeśli musisz, korzystanie z dynamicznego SQL nie jest niczym złym. W rzeczywistości w niektórych okolicznościach jest to jedyna dostępna opcja. Zaleca się, aby nie używać go, ponieważ tak, może prowadzić do wstrzyknięcia SQL, jeśli dane wejściowe nie są dezynfekowane, i tak, używanie dynamicznego SQL w często wywoływanych modułach może mieć negatywny wpływ na jego wydajność.
Nie wydaje mi się, aby istniał konkretny przykład, ale powiedziałbym tak: spróbuj osiągnąć to, czym jesteś po użyciu regularnych zapytań i instrukcji - dopiero wtedy, gdy wyczerpiesz wszystkie inne możliwości, zrób to dynamicznie. Pamiętaj tylko, że wykonanie dynamicznego ciągu SQL odbywa się w oddzielnej sesji użytkownika od modułu, który go wywołuje - więc możesz napotkać problemy z uprawnieniami, których się nie spodziewasz.
Jeśli martwisz się wydajnością; Sprawdź to. Jeśli martwisz się o bezpieczeństwo; sprawdź poprawność wprowadzonych danych. Nie ma żadnego dobra ani zła - wystarczy, że wykorzystasz swój najlepszy osąd w oparciu o informacje i narzędzia, które masz do dyspozycji w tym czasie.
To jest jak większość funkcji dbms, jeśli użyjesz go w odpowiedniej sytuacji, to robi to dobrze, a niewłaściwa sytuacja robi to źle.
Plusy: Niektórych rzeczy po prostu nie da się bez tego zrobić. Zazwyczaj uważam, że jest to tylko praca administracyjna, a nie kod aplikacji. Niektóre polecenia systemowe nie pozwalają na użycie parametrów jako danych wejściowych. Na przykład, jeśli muszę uruchomić coś przez sproc na każdej bazie danych, w wielu przypadkach z nieznanymi bazami danych, a polecenie nie akceptuje parametrów, zwykle rozwiązuję to za pomocą dynamicznego SQL. Jednak w Sybase ASE jest to coś więcej niż MSSQL.
Minusy: nie będę się w to zbytnio zastanawiał, ponieważ myślę, że wszyscy już to wiemy, ale może być pewne ryzyko zastrzyku SQL, jeśli zostanie użyte nieprawidłowo. Dla mnie większe jest to, że zapytanie będzie traktowane jak to, co jest, unikalne zapytanie adhoc, a nie część skompilowanego planu zapytań. Dla czegoś, co działa sporadycznie, nic wielkiego. Dla czegoś, co jest wykonywane setki razy na minutę i które będzie miało wiele unikalnych sql, wygenerowałoby wiele nowych, potencjalnie niepotrzebnych, planów kwerendy pochłaniających cykle i skracających prawidłowy czas bufora planu.
źródło
Nie używaj dynamicznego SQL.
99% czasu używa się dynamicznego SQL z powodu braku wiedzy na temat używania opcjonalnych parametrów w procedurach przechowywanych, reszta 1% czasu jest wykorzystywana do tworzenia bardzo złożonego zapytania dotyczącego raportu, którego klient nie rozumie parzysty. Klątwa i błogosławieństwa dynamicznego SQL nie pokazują przykładu, dlaczego warto go używać, zamiast tego sugeruje, że jest problematyczny, ponieważ zwiększa złożoność debugowania, utrzymywania, nie mówiąc już o zagrożeniach bezpieczeństwa związanych z SQL Wtrysk, niska wydajność nie dlatego, że pamięć podręczna, ale złe praktyki, które się z nią wiążą, takie jak używanie tymczasowych tabel i kursorów, które oczywiście są leniwe i naiwneprogramista nadużywałby. Nie ma czegoś takiego jak elastyczność w pisaniu zapytań w ten sposób, SQL jest językiem deklaratywnym i powinien być traktowany jako taki.
Lenistwo jest źródłem wszelkiego zła.
Paradoksalnie ta odpowiedź będzie zaliczana do najbardziej upartych .
źródło