SQL Server:通过变量更改当前数据库

时间:2012-02-06 18:50:05

标签: sql sql-server sql-server-2008 tsql

我正在使用SQL Server 2008,并且正在尝试将当前数据库名称更改为变量中的一个。我通常使用语句USE myDatabaseName明确地执行此操作。 问题出现了,因为如果我正在运行脚本并且如果我不更改数据库名称,则会在[master]数据库中创建所有表。

我尝试了以下操作,但似乎无法正常工作,因为它会继续将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

3 个答案:

答案 0 :(得分:13)

在动态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

答案 1 :(得分:3)

只是添加Martin Smith的答案,

如果是这样,您可以将表创建或表修改部署到多个数据库,您可以分离数据库创建和对象创建脚本,然后使用input file -i使用bat文件按顺序运行它们。这使您可以在脚本之间更改数据库,从主数据库到新数据库。

然后您的批处理文件可能

 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 

答案 2 :(得分:0)

这可以通过动态sql来完成。使用变量来存储dbname并使用此变量来构建像

这样的sql字符串
SELECT @Sql ='SELECT fields FROM ' + @dbname +'.Table'

然后使用EXEC()sp_executesql执行sql字符串。