2012-02-06 16 views
9

Sto utilizzando SQL Server 2008 e sto cercando di modificare il nome del database corrente in uno in una variabile. Normalmente lo faccio esplicitamente con la dichiarazione USE myDatabaseName. La domanda sorge perché se sto eseguendo uno script e se non cambio il nome del database, crea tutte le tabelle nel database [master].SQL Server: modifica del database corrente tramite la variabile

Ho provato quanto segue ma non sembra funzionare in quanto continua ad applicare il resto dei codici 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

come stai eseguendo la sceneggiatura? –

+0

Come una 'nuova query' a livello di server. – Rick

risposta

12

Esecuzione USE some_db in SQL dinamico funziona, ma purtroppo quando la portata esce dal contesto di database viene cambiato di nuovo a quello che era in origine.

Per questo è possibile utilizzare la modalità sqlcmd (abilitare questa opzione nel menu "Query" in 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 - Questo è esattamente (o, beh, molto vicino) a ciò che stavo rispondendo. Ma sei veramente veloce :-) – Lamak

+0

È possibile passare dalla modalità 'sqlcmd' a SQL dinamico nella stessa query? – Rick

+2

@Rick: la modalità 'sqlcmd' abilitata non impedisce l'utilizzo di costrutti SQL. Gli strumenti client eseguono la sostituzione della variabile prima che il comando venga inviato a SQL Server. –

0

Questo può essere fatto tramite sql dinamico. utilizzare una variabile per memorizzare dbname e utilizzare questa variabile per costruire una stringa SQL come

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

quindi utilizzare EXEC() o sp_executesql per eseguire la stringa SQL.

2

Giusto per aggiungere la risposta di Martin Smith,

Se è così è possibile distribuire la vostra creazione tabella o la modifica tabella nel database di più è possibile separare i vostri script di creazione del database e la creazione di oggetti, e poi eseguirli in sequenza usando un bat file utilizzando lo input file -i. Ciò consente di modificare i database tra gli script dal master al nuovo database.

quindi il file batch potrebbe

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

In genere però ho solo bisogno di fare questo quando ero schierando modifiche a più basi di dati (non chiedetemi perché) esempio

sqlcmd -S server\Instance -E -d OneDatabase -i CreateTables.sql 
sqlcmd -S server\Instance -E -d AnotherDatabase -i CreateTables.sql 
Problemi correlati