Wybacz, jestem programistą, który przeniósł się do świata SQL. Myślałem, że mogę poprawić trochę SQL, dodając zmienne, ale nie działało to tak, jak się spodziewałem. Czy ktoś może mi powiedzieć, dlaczego to nie działa? Nie chcę się obejść, chcę poznać powody, dla których to nie działa tak, jak wyobrażam sobie, że powinno, bo jestem pewien, że jest dobry powód, ale obecnie nie wyskakuje na mnie.
DECLARE @DatabaseName varchar(150)
SET @DatabaseName = 'MyAmazingDatabaseName'
CREATE DATABASE @DatabaseName
GO
USE @DatabaseName
GO
sql-server-2008
t-sql
Gareth
źródło
źródło
USE
polecenia z parametrem.GO
, poprzednio zadeklarowana zmienna znika. Możesz zajrzeć do zmiennych SQLCMD, które mogą, ale nie muszą dotyczyć twojego scenariusza.Odpowiedzi:
Na stronie online Książki dla zmiennych
Działa to tak, jak się spodziewałeś, jeśli na przykład użyjesz zmiennej w klauzuli where. Jeśli tak, to sądzę, że ma to coś wspólnego z tym, że parser nie jest w stanie ocenić zmiennej, a tym samym sprawdzić istnienia. Podczas wykonywania zapytanie jest najpierw analizowane pod kątem składni i obiektów, a następnie, jeśli parsowanie zakończy się powodzeniem, zapytanie zostanie wykonane w momencie, w którym zmienna zostanie ustawiona.
źródło
eval
funkcji w językach proceduralnych, takich jak JavaScript i Python. Jest to szybki sposób na utworzenie luk bezpieczeństwa.Ograniczenia użycia zmiennych w instrukcjach SQL wynikają z architektury SQL.
Przetwarzanie instrukcji SQL składa się z trzech faz:
Serwer SQL ukrywa krok przygotowawczy przed programistą i wykonuje go znacznie szybciej niż bardziej tradycyjne bazy danych, takie jak Oracle i DB2. Ze względów wydajnościowych SQL spędza potencjalnie dużo czasu na określeniu optymalnego planu wykonania, ale robi to tylko przy pierwszym napotkaniu instrukcji po ponownym uruchomieniu.
Tak więc w statycznym SQL zmienne mogą być używane tylko w miejscach, w których nie unieważnią planu wykonania, a więc nie dla nazw tabel, nazw kolumn (w tym nazw kolumn w warunkach GDZIE) itp.
Dynamiczny SQL istnieje w przypadkach, gdy nie można obejść ograniczeń, a programista wie, że jego wykonanie potrwa nieco dłużej. Dynamiczny SQL może być podatny na wstrzykiwanie złośliwego kodu, więc uważaj!
źródło
Jak widać, pytanie „dlaczego” wymaga innego rodzaju odpowiedzi, w tym uzasadnienia historycznego i podstawowych założeń dotyczących języka, nie jestem pewien, czy naprawdę mogę oddać sprawiedliwość.
Ten obszerny artykuł autorstwa SQL MVP Erlanda Sommarskoga zawiera uzasadnienie wraz z mechaniką:
Klątwa i błogosławieństwa dynamicznego SQL :
To (i bezpieczeństwo, patrz poniżej) jest prawdopodobnie największym powodem.
SQL działa przy założeniu, że zapytania nie są operacjami jednorazowymi, ale będą używane w kółko. Jeśli tabela (lub baza danych!) Nie jest faktycznie określona w zapytaniu, nie ma możliwości wygenerowania i zapisania planu wykonania do wykorzystania w przyszłości.
Tak, nie każde uruchamiane przez nas zapytanie zostanie ponownie użyte, ale jest to domyślna przesłanka działania SQL , więc „wyjątki” mają być wyjątkowe.
Kilka innych powodów, dla których Erland wymienia (zauważ, że wyraźnie wymienia zalety korzystania z procedur przechowywanych , ale wiele z nich to także zalety sparametryzowanych (niedynamicznych) zapytań):
Ponownie, każdy z nich ma sto niuansów, których nie będę tu wchodził.
źródło
Musisz użyć dynamicznego SQL
poniżej znajduje się wynik drukowania. Gdy usuniesz komentarz,
exec sp_executesql @sqltext
instrukcje zostaną faktycznie wykonane ...źródło