2012-02-06 68 views
9

我正在使用SQL Server 2008,並試圖將當前數據庫名稱更改爲變量中的一個。我通常會在USE myDatabaseName的陳述中明確地做到這一點。 問題出現了,因爲如果我正在運行一個腳本,並且如果我不更改數據庫名稱,它將創建[master]數據庫中的所有表。SQL Server:通過變量更改當前數據庫

我嘗試了以下方法,但似乎無法正常工作,因爲它始終將create tables代碼的其餘部分應用到[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

你是如何運行腳本的? – 2012-02-06 18:52:40

+0

作爲服務器級別的「新查詢」。 – Rick 2012-02-06 18:57:51

回答

12

動態SQL執行USE some_db的工作,但不幸的是,當範圍退出數據庫方面得到改變回到它最初。

您可以使用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 2012-02-06 18:55:32

+0

在同一個查詢中,是否可以從'sqlcmd'模式改回動態SQL? – Rick 2012-02-06 19:04:14

+2

@Rick - 啓用'sqlcmd'模式不會阻止您使用任何SQL結構。客戶端工具在將命令提交給SQL Server之前執行變量替換。 – 2012-02-06 19:07:38

0

這可以通過動態sql來完成。使用一個變量來存儲dbname和使用該變量建立一個SQL字符串等

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

然後使用EXEC()sp_executesql執行SQL字符串。

2

我想補充馬丁·史密斯的回答,

如果是這樣的話,你可以在創建表或表修改部署到多個數據庫,你可以分開你的數據庫創建和對象的創建腳本,然後按順序使用運行它們bat文件使用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