Gibt es eine Möglichkeit, eine TSQL-Variable konstant zu machen?
sql-server
tsql
TheEmirOfGroofunkistan
quelle
quelle
WITH SCHEMABINDING
sollte dies in eine 'echte' Konstante umwandeln (eine Voraussetzung dafür, dass eine UDF in SQL als deterministisch angesehen wird). Dh es sollte landen, wenn es zwischengespeichert wird. Trotzdem +1.WITH SCHEMABINDING
in derCREATE FUNCTION
Anweisung zu verwenden (im Gegensatz zu einer gespeicherten Prozedur, die möglicherweise die Funktion aufruft) - ist das richtig?Eine von Jared Ko angebotene Lösung ist die Verwendung von Pseudokonstanten .
Wie in SQL Server erläutert : Variablen, Parameter oder Literale? Oder ... Konstanten? ::
quelle
Meine Problemumgehung für fehlende Konstanten besteht darin, dem Optimierer Hinweise zum Wert zu geben.
Dies weist den Abfrage-Compiler an, die Variable beim Erstellen des Ausführungsplans so zu behandeln, als wäre sie eine Konstante. Der Nachteil ist, dass Sie den Wert zweimal definieren müssen.
quelle
Nein, aber es sollten gute alte Namenskonventionen verwendet werden.
quelle
FN_CONSTANT()
. Auf diese Weise ist klar, was es tut.Es gibt keine integrierte Unterstützung für Konstanten in T-SQL. Sie können den SQLMenace-Ansatz verwenden, um ihn zu simulieren (obwohl Sie nie sicher sein können, ob jemand anderes die Funktion überschrieben hat, um etwas anderes zurückzugeben ...) oder möglicherweise eine Tabelle mit Konstanten schreiben, wie hier vorgeschlagen . Vielleicht einen Trigger schreiben, der alle Änderungen an der
ConstantValue
Spalte rückgängig macht?quelle
Führen Sie vor der Verwendung einer SQL-Funktion das folgende Skript aus, um die Leistungsunterschiede festzustellen:
quelle
2760ms elapsed, using function
|2300ms elapsed, using local variable
|2286ms elapsed, using hard coded values
|5570 elapsed, using function
|406 elapsed, using local variable
|383 elapsed, using hard coded values
|3893 elapsed, using function without schemabinding
select top 1 @m = cv_val from code_values where cv_id = 'C101'
und dieselbe wechselten,... 'C201'
wobei code_values eine Wörterbuchtabelle mit 250 Variablen ist. Alle waren auf SQL-Server 2016Wenn Sie einen optimalen Ausführungsplan für einen Wert in der Variablen erhalten möchten, können Sie einen dynamischen SQL-Code verwenden. Es macht die Variable konstant.
quelle
Bei Aufzählungen oder einfachen Konstanten bietet eine Ansicht mit einer einzelnen Zeile eine hervorragende Leistung und Überprüfung der Kompilierungszeit / Abhängigkeitsverfolgung (da es sich um einen Spaltennamen handelt).
Siehe den Blog-Beitrag von Jared Ko unter https://blogs.msdn.microsoft.com/sql_server_appendix_z/2013/09/16/sql-server-variables-parameters-or-literals-or-constants/
Erstellen Sie die Ansicht
Verwenden Sie die Ansicht
quelle
Okay, mal sehen
Konstanten sind unveränderliche Werte, die zur Kompilierungszeit bekannt sind und sich während der Laufzeit des Programms nicht ändern
Das bedeutet, dass Sie in SQL Server niemals eine Konstante haben können
Der Wert hat sich gerade geändert
quelle
Da es keine eingebaute Unterstützung für Konstanten gibt, ist meine Lösung sehr einfach.
Da dies nicht unterstützt wird:
Ich würde es einfach umwandeln
Dies hängt natürlich davon ab, dass das Ganze (der Wert ohne Leerzeichen und der Kommentar) eindeutig ist. Das Ändern ist mit einem globalen Suchen und Ersetzen möglich.
quelle
In der Datenbankliteratur gibt es kein "Erstellen einer Konstante". Konstanten existieren so wie sie sind und werden oft als Werte bezeichnet. Man kann eine Variable deklarieren und ihr einen Wert (Konstante) zuweisen. Aus schulischer Sicht:
Hier ist @two eine Variable und 2 ist ein Wert / eine Konstante.
quelle
2
wird bei Zuweisung zur "Kompilierungszeit" in einen Binärwert übersetzt. Der tatsächlich codierte Wert hängt vom Datentyp ab, dem er zugewiesen ist (int, char, ...).Die beste Antwort kommt von SQLMenace, je nachdem, ob eine temporäre Konstante für die Verwendung in Skripten erstellt werden soll, dh über mehrere GO-Anweisungen / Stapel hinweg.
Erstellen Sie einfach die Prozedur in der Tempdb, dann haben Sie keine Auswirkungen auf die Zieldatenbank.
Ein praktisches Beispiel hierfür ist ein Datenbankerstellungsskript, das am Ende des Skripts, das die logische Schemaversion enthält, einen Steuerwert schreibt. Am Anfang der Datei befinden sich einige Kommentare mit Änderungsverlauf usw. In der Praxis werden die meisten Entwickler jedoch vergessen, nach unten zu scrollen und die Schemaversion am Ende der Datei zu aktualisieren.
Mit dem obigen Code kann oben eine sichtbare Schema-Versionskonstante definiert werden, bevor das Datenbankskript (kopiert von der Funktion zum Generieren von Skripten von SSMS) die Datenbank erstellt, aber am Ende verwendet wird. Dies steht dem Entwickler direkt neben dem Änderungsverlauf und anderen Kommentaren gegenüber, sodass es sehr wahrscheinlich ist, dass er aktualisiert wird.
Beispielsweise:
quelle