Umieść cały skrypt w ciągu szablonu, z symbolami zastępczymi {SERVERNAME}. Następnie edytuj ciąg używając:
SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)
a następnie uruchom go z
EXECUTE (@SQL_SCRIPT)
Aż trudno uwierzyć, że w ciągu trzech lat nikt nie zauważył, że mój kod nie działa !
Nie możesz EXEC
wiele partii. GO
jest separatorem wsadowym, a nie instrukcją T-SQL. Konieczne jest zbudowanie trzech oddzielnych ciągów, a następnie EXEC
każdego po podstawieniu.
Przypuszczam, że można by zrobić coś „sprytnego”, dzieląc pojedynczy ciąg szablonu na wiele wierszy przez podział GO
; Zrobiłem to w kodzie ADO.NET.
Skąd mam słowo „SERVERNAME”?
Oto kod, który właśnie przetestowałem (i który działa):
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
byłby bardziej odpowiednim typem danych niżVARCHAR(255)
powinien być używanyQUOTENAME
do radzenia sobie ze wszystkimi możliwymi nazwami baz danych (i prawdopodobnie do zapobiegania wstrzykiwaniu SQL w zależności od źródła nazwy)CREATE SCHEMA
w innej bazie danych, używającUSE {DBNAME}
. Schemat tworzy się w złej bazie danych; /Możesz również użyć
sqlcmd
do tego trybu (włącz go w menu „Zapytanie” w Management Studio).EDYTOWAĆ:
Sprawdź ten artykuł MSDN, aby ustawić parametry za pomocą narzędzia SQLCMD.
źródło
Niestety nie możesz zadeklarować nazw baz danych ze zmienną w tym formacie.
W przypadku tego, co próbujesz osiągnąć, będziesz musiał zawrzeć swoje instrukcje w instrukcji EXEC (). Więc miałbyś coś takiego:
Wtedy zadzwoń
aby wykonać łańcuch sql.
źródło
EXEC
szuka procedury składowanej. W takim przypadkuEXECUTE
jest potrzebny.EXEC
iEXECUTE
są takie same. Złożyłem oświadczenie po niepowodzeniuEXEC
i sukcesieEXECUTE
. Chociaż oczywiście mój prawdziwy problem nie był związany z żadnym z nich.Nie można używać zmiennej w instrukcji tworzenia tabeli. Najlepszą rzeczą, jaką mogę zasugerować, jest napisanie całego zapytania jako łańcucha i wykonanie tego.
Spróbuj czegoś takiego:
źródło