Beim Versuch, mein SQL-Skript im SQLCMD-Modus aufzuräumen, stieß ich auf ein Problem:
:setvar db_suffix "some_suffix"
:setvar some_db "some_db_$(db_suffix)"
print 'some_db: $(some_db)'
Die Ausgabe davon ist:
some_db: some_db_$(db_suffix)
Was ich jedoch erwartet hatte, war:
some_db: some_db_some_suffix
Gibt es eine Möglichkeit, eine solche variable Interpolation durchzuführen?
(Beachten Sie, dass T-SQL-Funktionen wie CONCAT()
nicht funktionieren, da ich die Variable als Datenbanknamen verwenden werde.)
sql-server
scripting
sqlcmd
user193130
quelle
quelle
Antworten:
In gewisser Weise irgendwie. Nur nicht direkt.
Sie müssen einige Dinge beachten:
Der Wert, auf den Sie eine Variable setzen,
:setvar
ist ein einfacher Literalwert. Sie können dies sehen, indem Sie nur die folgenden zwei Zeilen ausführen:was zurückgibt:
Wenn der SQLCMD / SQLCMD-Modus versuchen würde, den Wertteil von
:setvar
in irgendeiner Weise zu analysieren , würde dies zu einem Fehler führen, wenn er$(var2)
nicht definiert wird.Das Ersetzen von Variablen ist in einigen anderen SQLCMD-Befehlen zulässig.
Dies bedeutet, dass Sie beispielsweise einen Shell-Befehl ausführen können, während Sie eine SQLCMD-Variable an diese Befehlszeile übergeben:
Die beiden obigen Zeilen erstellen / überschreiben eine Datei C: \ TEMP \ setvar.txt mit dem Text ": setvar other_db [MyDB _ $ (db_suffix)]", wobei sie
$(db_suffix)
durch den Wert "some_suffix" ersetzt wird.SQLCMD-Befehle in einer Datei / einem Skript, die bzw. das über den
:r
Befehl importiert wird, werden in einem zweiten Durchgang verarbeitet, sodass die in diesen externen Dateien festgelegten Variablen im Hauptskript wiedergegeben werden können:Kehrt zurück:
SQLCMD-Befehle werden pro Stapel interpretiert !! Wenn Sie also den verketteten Wert ändern möchten, müssen Sie jedes Erstellen und Lesen der temporären Datei trennen. Andernfalls wird der Wert, den Sie erhalten, als letzter festgelegt, da alle Befehle
!!
und:r
vor den Variablenwerten verarbeitet werden werden ersetzt, und dann kann der Stapel an SQL Server gesendet werden, um das T-SQL zu verarbeiten. Zum Beispiel:Wird zurückkehren:
ABER, kommentieren Sie das aus
--GO
und Sie erhalten Folgendes:quelle
ein bisschen knifflig
AUSGABE
quelle