Sql server SQL Server动态创建数据库并在脚本中使用该数据库

Sql server SQL Server动态创建数据库并在脚本中使用该数据库,sql-server,Sql Server,我有一个脚本,可以由以下内容表示: DECLARE @DatabaseNamePart VARCHAR(50) = 'Part1' DECLARE @DataBaseName VARCHAR(70) = 'MyDataBase_' + @DatabaseNamePart IF NOT EXISTS (SELECT * FROM master..sysdatabases WHERE [name] = @DataBaseName) BEGIN DECLARE @SqlQuery NVARC

我有一个脚本,可以由以下内容表示:

DECLARE @DatabaseNamePart VARCHAR(50) = 'Part1'
DECLARE @DataBaseName VARCHAR(70) = 'MyDataBase_' + @DatabaseNamePart

IF NOT EXISTS (SELECT * FROM master..sysdatabases WHERE [name] = @DataBaseName) BEGIN
    DECLARE @SqlQuery NVARCHAR(150) = 'CREATE DATABASE ' + @DataBaseName
    EXECUTE (@SqlQuery)     
END

DECLARE @UseDatabase NVARCHAR(150) = 'USE ' + @DataBaseName
EXECUTE ( @UseDatabase )

/**************************************************************************/
/*                           CREATE TABLES                                */
/**************************************************************************/

IF NOT EXISTS (SELECT * FROM sysobjects WHERE [name]='MyTable' AND xtype='U') BEGIN
    CREATE TABLE MyTable (
        [id] INT PRIMARY KEY NOT NULL IDENTITY,
        [Name] VARCHAR(150) NOT NULL,
    )
END
问题是,当我创建表时,它不是在新数据库中创建的,而是在我当前所在的任何数据库中创建的


您知道如何使用刚创建但事先不知道名称的数据库吗?

执行动态SQL后,会话将恢复到原始数据库上下文。如果需要在同一批中创建数据库和对象,则需要动态执行这些数据库和对象,并在脚本中包含用法。在不同的批处理中执行
创建数据库
会容易得多。这正是我试图避免的:(您如何执行此脚本?为什么不希望对数据库进行多次调用?此脚本位于存储过程中,以避免对服务器进行多次调用。这背后的原因是,应用程序调用是一个连接不好的3层应用程序,每次对服务器的调用都需要500毫秒到800毫秒的时间。目前,它不是poss由于许多原因,我可能会更改此设置,因此我被要求将对服务器的调用减少到尽可能小的程度。
GO
语句仅由SQL server实用程序实现,因此如果使用ADO.NET等工具执行此代码,则将不起作用。请参见此处的备注:“GO不是Transact-SQL语句;它是由sqlcmd和osql实用程序以及SQL Server Management Studio代码编辑器识别的命令。”
DECLARE @DatabaseNamePart VARCHAR(50) = 'Part1'
DECLARE @DataBaseName VARCHAR(70) = 'MyDataBase_' + @DatabaseNamePart

IF NOT EXISTS (SELECT * FROM master..sysdatabases WHERE [name] = @DataBaseName) BEGIN
    DECLARE @SqlQuery NVARCHAR(150) = 'CREATE DATABASE ' + @DataBaseName
    EXECUTE (@SqlQuery)     
END



-- code edited - declaring a new variable and setting the dbname

Declare @newDBName VARCHAR(30)

SET @DBName = @DataBaseName

exec('USE '+ @DBName)

-- code edited


--Create tables query

IF NOT EXISTS (SELECT * FROM sysobjects WHERE [name]='MyTable' AND xtype='U') BEGIN
    CREATE TABLE MyTable (
        [id] INT PRIMARY KEY NOT NULL IDENTITY,
        [Name] VARCHAR(150) NOT NULL,
    )
END