我正在使用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
答案 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字符串。