2012-02-06 7 views
9

SQL Server 2008を使用していて、現在のデータベース名を変数に変更しようとしています。私は通常これを明示的に、文USE myDatabaseNameで行う。 問題は、私がスクリプトを実行していて、データベース名を変更しないと、[master]データベース内のすべてのテーブルが作成されるために発生します。SQL Server:変数を使用して現在のデータベースを変更する

私は以下を試しましたが、create tablesコードの残りの部分を[master]に適用し続けるので、うまくいかないようです。動的SQLでUSE some_dbを実行

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

どのようにスクリプトを実行していますか? –

+0

サーバレベルでの '新しいクエリ'として。 – Rick

答えて

12

は、作業を行うが、スコープが終了したときに、残念ながらデータベースコンテキストは、それがもともと何だったかに戻って変更されます。

sqlcmdモードを使用できます(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 - これは私が答えていたものとまったく(まあまあまあ近い)。しかし、あなたは本当に速いです:-) – Lamak

+0

'sqlcmd'モードから同じクエリで動的SQLに戻ることは可能ですか? – Rick

+2

@Rick - 'sqlcmd'モードを有効にしても、SQL構造体を使用することはできません。クライアントツールは、コマンドがSQL Serverに送信される前に変数の置換を行います。 –

0

これは、動的SQLを使用して行うことができます。その後、SQL文字列を実行するためにEXEC()またはsp_executesqlを使用DBNAMEを格納する変数を使用して

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

ようなSQL文字列を構築するために、この変数を使用します。

2

ただ、これはあなたがあなたのデータベース作成とオブジェクトの作成スクリプトを分離することができ、複数のデータベースにあなたの表の作成や表の変更を展開することができそうであるならば、

をマーティン・スミスの答えを追加し、使用して順番に実行しますバットファイルにはinput file -iを使用してください。これにより、スクリプト間のデータベースをマスターデータベースから新しいデータベースに変更することができます。

、あなたのバッチファイルがあります

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

一般的に、私は複数のデータベースへの変更(理由は聞かないでください)例えばを展開されたとき、私はこれを行うために必要としましたが

sqlcmd -S server\Instance -E -d OneDatabase -i CreateTables.sql 
sqlcmd -S server\Instance -E -d AnotherDatabase -i CreateTables.sql 
関連する問題