Gibt es eine Möglichkeit, eine Variable auf einmal beizubehalten?
Declare @bob as varchar(50);
Set @bob = 'SweetDB';
GO
USE @bob --- see note below
GO
INSERT INTO @bob.[dbo].[ProjectVersion] ([DB_Name], [Script]) VALUES (@bob,'1.2')
Siehe diese SO- Frage für die Zeile 'USE @bob'.
Antworten:
Der
go
Befehl wird verwendet, um Code in separate Stapel aufzuteilen. Wenn Sie genau das tun möchten, sollten Sie es verwenden. Dies bedeutet jedoch, dass die Stapel tatsächlich getrennt sind und Sie keine Variablen zwischen ihnen teilen können.In Ihrem Fall ist die Lösung einfach; Sie können die
go
Anweisungen einfach entfernen , sie werden in diesem Code nicht benötigt.Randnotiz: Sie können keine Variable in einer
use
Anweisung verwenden, es muss der Name einer Datenbank sein.quelle
go
Befehl wird verwendet, um Code in separate Stapel aufzuteilen. Wenn Sie dies tun möchten, sollten Sie es verwenden. Dies bedeutet jedoch, dass die Stapel tatsächlich getrennt sind und Sie keine Variablen zwischen ihnen teilen können.Verwenden Sie eine temporäre Tabelle:
quelle
Ich bevorzuge diese Antwort aus dieser Frage Globale Variablen mit GO
Dies hat den zusätzlichen Vorteil, dass Sie auch das tun können, was Sie ursprünglich wollten.
Die Einschränkung besteht darin, dass Sie den SQLCMD-Modus (unter Abfrage-> SQLCMD) oder standardmäßig für alle Abfragefenster aktivieren müssen (Extras-> Optionen, dann Abfrageergebnisse-> Standardmäßig neue Abfragen im SQLCMD-Modus öffnen).
Dann können Sie den folgenden Codetyp verwenden (vollständig aus derselben Antwort von Oscar E. Fraxedas Tormo herausgerissen ).
quelle
Wenn Sie SQL Server verwenden, können Sie globale Variablen für ganze Skripte einrichten, z.
und später im Skript verwenden als:
Stellen Sie sicher, dass der SQLCMD-Modus in Server Managment Studi aktiviert ist. Sie können dies über das Hauptmenü tun. Klicken Sie auf Abfrage und aktivieren Sie den SQLCMD-Modus.
Mehr zum Thema finden Sie hier: MS-Dokumentation
quelle
Ich bin mir nicht sicher, ob das hilft
quelle
Temp-Tabellen werden über GO-Anweisungen beibehalten, also ...
Es ist nicht schön, aber es funktioniert
quelle
Erstellen Sie Ihre eigenen gespeicherten Prozeduren, die in einer temporären Tabelle gespeichert / geladen werden.
Dann können Sie dies verwenden:
Ausgabe:
Sie können auch diese verwenden:
Ausgabe von
exec dbo.MyVariableList
:Es stellt sich heraus, dass es sehr nützlich ist, alle Variablen in einer Tabelle auflisten zu können. Selbst wenn Sie eine Variable später nicht laden, ist es ideal für Debugging-Zwecke, alles an einem Ort zu sehen.
Dies verwendet eine temporäre Tabelle mit einem
##
Präfix, sodass es gerade ausreicht, um eine GO-Anweisung zu überleben. Es soll in einem einzigen Skript verwendet werden.Und die gespeicherten Prozeduren:
quelle
Wenn Sie nur ein binäres Ja / Nein benötigen (z. B. wenn eine Spalte vorhanden ist), können Sie
SET NOEXEC ON
die Ausführung von Anweisungen deaktivieren.SET NOEXEC ON
funktioniert über GO (über Chargen hinweg). Aber denken Sie daran auf EXEC zurückzudrehen mitSET NOEXEC OFF
am Ende des Skripts.Dadurch werden Anweisungen kompiliert, aber nicht ausgeführt. Sie erhalten also immer noch "Kompilierungsfehler", wenn Sie auf ein nicht vorhandenes Schema verweisen. Es funktioniert also, um das Skript in der zweiten Ausführung "auszuschalten" (was ich tue), aber nicht, um Teile des Skripts in der ersten Ausführung auszuschalten, da beim Verweisen auf Spalten oder Tabellen, die nicht verwendet werden, immer noch Kompilierungsfehler auftreten existiert noch nicht.
quelle
Sie können NOEXEC verwenden, indem Sie die folgenden Schritte ausführen:
Tabelle erstellen
Fügen Sie Prozedurversionen und einen Zeiger auf die Version in eine temporäre Tabelle ein
#temp_procedure_version
- Beispiel procedure_version Zeiger
in
temp_procedure_version
Werte einfügen (1.0, 'erste Version')in
temp_procedure_version
Werte einfügen (2.0, 'endgültige Version')Rufen Sie dann die Prozedurversion ab. Sie können die where-Bedingung wie in der folgenden Anweisung verwenden
Wählen Sie
@ProcedureVersion=ProcedureVersion
aus#temp_procedure_version
wopointer='first version'
- Prozedur Version 1.0 hier einfügen
Erstellen Sie die Prozedur Version 1.0 als .....
Wählen Sie
@ProcedureVersion=ProcedureVersion
aus,#temp_procedure_version
wo pointer = 'endgültige Version'Erstellen Sie die Prozedur Version 2.0 als .....
- Lassen Sie den temporären Tisch fallen
Tabelle ablegen
#temp_procedure_version
quelle