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

Ric*_*ick 9 sql t-sql sql-server sql-server-2008

我正在使用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
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 13

USE some_db在动态SQL中执行确实有效,但不幸的是,当范围退出数据库上下文时,会将其更改回原来的状态.

您可以使用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
Run Code Online (Sandbox Code Playgroud)

  • @Rick - 启用`sqlcmd`模式不会阻止您使用任何SQL结构.在将命令提交到SQL Server之前,客户端工具执行变量替换. (2认同)