Coloque o script inteiro em uma sequência de modelos, com espaços reservados {SERVERNAME}. Em seguida, edite a string usando:
SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)
e execute-o com
EXECUTE (@SQL_SCRIPT)
É difícil acreditar que, no decorrer 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 lotes, não uma instrução T-SQL. É necessário construir três strings separadas e depois para EXEC
cada uma após a substituição.
Suponho que alguém possa fazer algo "inteligente" quebrando a cadeia de modelo único em várias linhas dividindo GO
; Eu fiz isso no código ADO.NET.
E de onde eu recebi a palavra "SERVERNAME"?
Aqui está um código que eu 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)
SYSNAME
Seria um tipo de dados mais apropriado queVARCHAR(255)
também deve usarQUOTENAME
para lidar com todos os nomes de banco de dados possíveis (e possivelmente a injeção prevent SQL dependendo da fonte do nome)CREATE SCHEMA
em outro banco de dados, usandoUSE {DBNAME}
. O esquema cria no banco de dados errado; /Você também pode usar o
sqlcmd
modo para isso (ative-o no menu "Consulta" no Management Studio).EDITAR:
Verifique este artigo do MSDN para definir parâmetros por meio da ferramenta SQLCMD.
fonte
Infelizmente, você não pode declarar nomes de bancos de dados com uma variável nesse formato.
Para o que você está tentando realizar, será necessário agrupar suas instruções em uma instrução EXEC (). Então, você teria algo como:
Então ligue
para executar a string sql.
fonte
EXEC
procura um procedimento armazenado. Neste casoEXECUTE
é necessário.EXEC
eEXECUTE
são os mesmos. Eu fiz a declaração depois de falharEXEC
e ter sucesso comEXECUTE
. Embora, obviamente, meu verdadeiro problema não tenha relação com nenhum dos dois.Você não pode usar uma variável em uma instrução create table. A melhor coisa que posso sugerir é escrever a consulta inteira como uma string e executá-la.
Tente algo como isto:
fonte