Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como usar uma variável para o nome do banco de dados em T-SQL?


Coloque o script inteiro em uma string de modelo, com espaços reservados {SERVERNAME}. Em seguida, edite a string usando:
SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)

e depois execute-o com
EXECUTE (@SQL_SCRIPT)

É difícil acreditar que, ao longo de três anos, ninguém percebeu que meu código não funciona !

Você não pode EXEC vários lotes. GO é um separador de lote, não uma instrução T-SQL. É necessário construir três strings separadas e depois EXEC cada um após a substituição.

Suponho que alguém poderia fazer algo "inteligente" quebrando a única string de modelo em várias linhas, dividindo em GO; Eu fiz isso no código ADO.NET.

E de onde eu tirei a palavra "SERVERNAME"?

Aqui está um código que acabei de testar (e que funciona):
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)