Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come utilizzare una variabile per il nome del database in T-SQL?

Inserisci l'intero script in una stringa modello, con i segnaposto {SERVERNAME}. Quindi modifica la stringa utilizzando:

SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)

e quindi eseguilo con

EXECUTE (@SQL_SCRIPT)

È difficile credere che, nel corso di tre anni, nessuno si sia accorto che il mio codice non funziona !

Non puoi EXEC più lotti. GO è un separatore batch, non un'istruzione T-SQL. È necessario creare tre stringhe separate, quindi EXEC ciascuno dopo la sostituzione.

Suppongo che si possa fare qualcosa di "intelligente" suddividendo la singola stringa del modello in più righe suddividendola su GO; L'ho fatto nel codice ADO.NET.

E da dove ho preso la parola "SERVERNAME"?

Ecco del codice che ho appena testato (e che funziona):

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)