Fügen Sie das gesamte Skript in eine Vorlagenzeichenfolge mit Platzhaltern {SERVERNAME} ein. Bearbeiten Sie dann die Zeichenfolge mit:
SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)
und dann ausführen mit
EXECUTE (@SQL_SCRIPT)
Es ist kaum zu glauben, dass im Laufe von drei Jahren niemand bemerkt hat, dass mein Code nicht funktioniert !
Sie können nicht EXEC
mehrere Chargen. GO
ist ein Batch-Trennzeichen, keine T-SQL-Anweisung. Es ist notwendig, drei separate Zeichenfolgen zu erstellen und EXEC
nach der Ersetzung jeweils eine.
Ich nehme an, man könnte etwas "Kluges" tun, indem man die einzelne Vorlagenzeichenfolge durch Aufteilen in mehrere Zeilen aufteilt GO
. Ich habe das in ADO.NET-Code gemacht.
Und woher habe ich das Wort "SERVERNAME"?
Hier ist ein Code, den ich gerade getestet habe (und der funktioniert):
DECLARE @DBNAME VARCHAR(255)
SET @DBNAME = 'TestDB'
DECLARE @CREATE_TEMPLATE VARCHAR(MAX)
DECLARE @COMPAT_TEMPLATE VARCHAR(MAX)
DECLARE @RECOVERY_TEMPLATE VARCHAR(MAX)
SET @CREATE_TEMPLATE = 'CREATE DATABASE {DBNAME}'
SET @COMPAT_TEMPLATE='ALTER DATABASE {DBNAME} SET COMPATIBILITY_LEVEL = 90'
SET @RECOVERY_TEMPLATE='ALTER DATABASE {DBNAME} SET RECOVERY SIMPLE'
DECLARE @SQL_SCRIPT VARCHAR(MAX)
SET @SQL_SCRIPT = REPLACE(@CREATE_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)
SET @SQL_SCRIPT = REPLACE(@COMPAT_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)
SET @SQL_SCRIPT = REPLACE(@RECOVERY_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)
SYSNAME
wäre ein geeigneterer Datentyp, als erVARCHAR(255)
auch verwenden sollteQUOTENAME
, um mit allen möglichen Datenbanknamen umzugehen (und möglicherweise die SQL-Injection abhängig von der Quelle des Namens zu verhindern)CREATE SCHEMA
in einer anderen Datenbank verwenden möchteUSE {DBNAME}
. Schema erstellt in falscher Datenbank; /Sie können hierfür auch den
sqlcmd
Modus verwenden (aktivieren Sie diesen im Menü "Abfrage" in Management Studio).BEARBEITEN:
Überprüfen Sie diesen MSDN- Artikel, um Parameter über das SQLCMD-Tool festzulegen.
quelle
Leider können Sie keine Datenbanknamen mit einer Variablen in diesem Format deklarieren.
Für das, was Sie erreichen möchten, müssen Sie Ihre Anweisungen in eine EXEC () - Anweisung einschließen. Sie hätten also so etwas wie:
Dann ruf an
um die SQL-Zeichenfolge auszuführen.
quelle
EXEC
sucht nach einer gespeicherten Prozedur. In diesem FallEXECUTE
wird benötigt.EXEC
undEXECUTE
sind die gleichen. Ich gab die Erklärung ab, nachdem ich versagt hatteEXEC
und Erfolg hatteEXECUTE
. Obwohl mein eigentliches Problem offensichtlich auch nichts damit zu tun hatte.Sie können keine Variable in einer Anweisung zum Erstellen einer Tabelle verwenden. Das Beste, was ich vorschlagen kann, ist, die gesamte Abfrage als Zeichenfolge zu schreiben und diese auszuführen.
Versuchen Sie so etwas:
quelle