2012-02-06 14 views
9

Estoy usando SQL Server 2008 y estoy tratando de cambiar el nombre de la base de datos actual por uno en una variable. Normalmente hago esto explícitamente con la declaración USE myDatabaseName. La pregunta surge porque si estoy ejecutando un script y si no cambio el nombre de la base de datos, crea todas las tablas en la base de datos [master].SQL Server: Cambiar la base de datos actual a través de la variable

Intenté lo siguiente pero no parece funcionar ya que sigue aplicando el resto de los códigos create tables a [master].

DECLARE @dbName CHAR(50) 
DECLARE @SqlQuery varchar(50) 
SET @dbName = 'MyNewDatabaseName' 

IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = @dbName) 
BEGIN 
    SELECT @SqlQuery = 'CREATE DATABASE ' + @dbName + 'COLLATE SQL_Latin1_General_CP1_CI_AS' 
    EXEC(@SqlQuery) 
END 

Select @SqlQuery = 'Use ' + @dbName 
EXEC(@SqlQuery) 
go 
+0

¿cómo está ejecutando el script? –

+0

Como una 'nueva consulta' en el nivel del servidor. – Rick

Respuesta

12

Ejecución USE some_db en SQL dinámico funciona, pero por desgracia, cuando el alcance sale del marco de base de datos se cambia de nuevo a lo que era originalmente.

Puede usar el modo sqlcmd para esto (habilítelo en el menú "Consulta" en Management Studio).

:setvar dbname "MyNewDatabaseName" 

IF DB_ID('$(dbname)') IS NULL 
    BEGIN 

    DECLARE @SqlQuery NVARCHAR(1000); 
    SET @SqlQuery = N'CREATE DATABASE ' + QUOTENAME('$(dbname)') + ' 
      COLLATE SQL_Latin1_General_CP1_CI_AS' 
    EXEC(@SqlQuery) 

    END 

GO 

USE $(dbname) 

GO 
+0

+1 - Esto es exactamente (o, bueno, muy cerca) de lo que estaba respondiendo. Pero eres realmente rápido :-) – Lamak

+0

¿Es posible cambiar del modo 'sqlcmd' de nuevo a SQL dinámico en la misma consulta? – Rick

+2

@Rick - Tener el modo 'sqlcmd' habilitado no impide el uso de construcciones SQL. Las herramientas del cliente realizan la sustitución de variables antes de enviar el comando a SQL Server. –

0

Esto se puede hacer mediante sql dinámico. utilizar una variable para almacenar nombredb y utilizar esta variable para construir una cadena SQL como

SELECT @Sql ='SELECT fields FROM ' + @dbname +'.Table' 

a continuación, utilizar EXEC() o sp_executesql para ejecutar la cadena SQL.

2

Sólo para añadir respuesta de Martin Smith,

Si esto es así se puede implementar la creación de su tabla o modificación tabla a múltiples bases de datos se puede separar la creación de su base de datos y la creación de objetos guiones, y luego ejecutarlos en secuencia utilizando una archivo bat usando el input file -i. Esto le permite cambiar las bases de datos entre las secuencias de comandos del maestro a la nueva base de datos.

entonces su archivo por lotes podría

sqlcmd -S server\Instance -E -i createdatabase.sql 
sqlcmd -S server\Instance -E -d MyNewDatabaseName -i CreateTables.sql 

Por lo general, sin embargo sólo he necesitaba hacer esto cuando estaba desplegando cambios en varias bases de datos (no preguntar por qué), por ejemplo,

sqlcmd -S server\Instance -E -d OneDatabase -i CreateTables.sql 
sqlcmd -S server\Instance -E -d AnotherDatabase -i CreateTables.sql 
Cuestiones relacionadas