Verzeih mir, ich bin ein Entwickler, der in die Welt von SQL gewechselt ist. Ich dachte, ich könnte etwas SQL verbessern, indem ich Variablen hinzufüge, aber es funktionierte nicht so, wie ich es erwartet hatte. Kann mir jemand sagen warum das nicht geht? Ich möchte keine Abhilfe schaffen, ich möchte die Gründe wissen, warum dies nicht so funktioniert, wie ich es mir vorstelle, da ich mir sicher bin, dass es einen guten Grund gibt, aber momentan springt es mir nicht auf die Nerven.
DECLARE @DatabaseName varchar(150)
SET @DatabaseName = 'MyAmazingDatabaseName'
CREATE DATABASE @DatabaseName
GO
USE @DatabaseName
GO
sql-server-2008
t-sql
gareth
quelle
quelle
USE
Befehl mit einem Parameter zu verwenden.GO
, verschwindet die zuvor deklarierte Variable. Möglicherweise möchten Sie sich mit SQLCMD-Variablen befassen, die möglicherweise für Ihr Szenario gelten oder nicht.Antworten:
Per der Books Online-Seite für Variablen
Es würde so funktionieren, wie Sie es erwartet hatten, wenn Sie beispielsweise Ihre Variable in einer where-Klausel verwenden würden. Was den Grund angeht, so hat dies vermutlich etwas mit dem Parser zu tun, der die Variable nicht auswerten und somit auf Existenz prüfen kann. Bei der Ausführung wird die Abfrage zuerst nach Syntax und Objekten analysiert. Wenn die Analyse erfolgreich ist, wird die Abfrage ausgeführt, an welcher Stelle die Variable gesetzt wird.
quelle
eval
Funktionen in prozeduralen Sprachen wie JavaScript und Python. Es ist eine schnelle Möglichkeit, Sicherheitslücken zu schaffen.Die Einschränkungen bei der Verwendung von Variablen in SQL-Anweisungen ergeben sich aus der Architektur von SQL.
Die Verarbeitung einer SQL-Anweisung umfasst drei Phasen:
SQL Server verbirgt den Vorbereitungsschritt vor dem Programmierer und führt ihn viel schneller aus als herkömmliche Datenbanken wie Oracle und DB2. Aus Performancegründen verbringt SQL möglicherweise viel Zeit damit, einen optimalen Ausführungsplan zu bestimmen, dies jedoch nur, wenn die Anweisung zum ersten Mal nach einem Neustart auftritt.
In statischem SQL dürfen Variablen daher nur an Stellen verwendet werden, an denen sie den Ausführungsplan nicht ungültig machen, also nicht für Tabellennamen, Spaltennamen (einschließlich Spaltennamen in WHERE-Bedingungen) usw.
Dynamisches SQL gibt es für Fälle, in denen man die Einschränkungen nicht umgehen kann und der Programmierer weiß, dass die Ausführung etwas länger dauert. Dynamic SQL kann anfällig für bösartigen Code sein. Seien Sie also vorsichtig!
quelle
Wie Sie sehen, erfordert die "Warum" -Frage eine andere Art von Antwort, einschließlich historischer Gründe und zugrunde liegender Annahmen für die Sprache. Ich bin mir nicht sicher, ob ich dieser Frage wirklich gerecht werden kann.
In diesem umfassenden Artikel von SQL MVP Erland Sommarskog wird versucht, einige Gründe zusammen mit den Mechanismen anzugeben:
Der Fluch und der Segen von Dynamic SQL :
Dies (und die Sicherheit, siehe unten) ist wahrscheinlich der Hauptgrund.
SQL geht davon aus, dass Abfragen keine einmaligen Vorgänge sind, sondern immer wieder verwendet werden. Wenn die Tabelle (oder die Datenbank!) Nicht tatsächlich in der Abfrage angegeben ist, kann kein Ausführungsplan für die zukünftige Verwendung generiert und gespeichert werden.
Ja, nicht jede Abfrage, die wir ausführen, wird wiederverwendet. Dies ist jedoch die Standardvoraussetzung für SQL , sodass "Ausnahmen" als außergewöhnlich angesehen werden.
Einige andere Gründe, die Erland aufführt (beachten Sie, dass er die Vorteile der Verwendung gespeicherter Prozeduren explizit auflistet , aber viele davon sind auch Vorteile parametrisierter (nicht dynamischer) Abfragen):
Auch hier hat jede hundert Nuancen, auf die ich hier nicht eingehen werde.
quelle
Sie müssen dynamisches SQL verwenden
Unten ist die Ausgabe von print. Sobald Sie das Kommentarzeichen entfernen, werden
exec sp_executesql @sqltext
die Anweisungen tatsächlich ausgeführt.quelle