Sql server Sql脚本为新数据库创建问题

Sql server Sql脚本为新数据库创建问题,sql-server,tsql,Sql Server,Tsql,我想创建sql脚本,该脚本将在服务器上运行,以检查数据库是否不存在,然后创建新数据库,如果存在,则更新其表和SP。但问题是,如果它不存在,它会创建数据库,但表和sp会转到主数据库 样品 DECLARE @dbname nvarchar(128) SET @dbname = N'ABC' IF (NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE ('[' + name + ']' = @dbna

我想创建sql脚本,该脚本将在服务器上运行,以检查数据库是否不存在,然后创建新数据库,如果存在,则更新其表和SP。但问题是,如果它不存在,它会创建数据库,但表和sp会转到主数据库

样品

    DECLARE @dbname nvarchar(128)
    SET @dbname = N'ABC'

    IF (NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE ('[' + 
    name + ']' = @dbname OR name = @dbname)))
    BEGIN
        PRINT 'New Database '
        CREATE DATABASE [ABC];
        USE ABC;  // This use statement is not working i supposed

        CREATE TABLE [dbo].[Product_Container](
            [ProductID] [int] NOT NULL,
            [ContainerID] [int] NOT NULL,
            [AssociatedProductID] [int] NOT NULL
        ) ON [PRIMARY]


         END
    ELSE
        BEGIN
           PRINT 'Existing Database '
        END
这是正在运行的代码

begin
DECLARE @dbname nvarchar(128), @command1 nvarchar(max), @command2 nvarchar(max)
SET @dbname = N'ABC'
    IF (NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = @dbname))
    BEGIN
        PRINT 'New Database Creating' + @dbname
        set @command1 = 'USE MASTER; CREATE DATABASE ' + @dbname + '; '
        --set @command += 'USE ' + @dbname + '; '

        set @command2 = 'CREATE TABLE [ABC].[dbo].[Product_Container](
            [ProductID] [int] NOT NULL,
            [ContainerID] [int] NOT NULL,
            [AssociatedProductID] [int] NOT NULL
        ) ON [PRIMARY];'

         END
    ELSE
        BEGIN
           PRINT 'Existing Database ' + @dbname
        END
    exec sp_executesql @command1;
    exec sp_executesql @command2;
    end;

USE
语句中的数据库名称被解释为脚本正在被解析; 在执行脚本之前。 因此,
CREATE DATABASE
USE
不能在同一批中

我建议将脚本分为多个批次。 这意味着您必须去掉
IF
语句。 我建议改为使用异常

分批拆分脚本并不像看上去那么简单。 即使第一批处理失败,但即使出现异常也不会阻止第二批处理的执行。 正如@clifton_h所建议的,您可以使用动态SQL。 也就是说,把整个第二部分放在一个字符串中。 我并不特别喜欢这种方法,因为它使脚本更难维护

DECLARE @dbname nvarchar(128) = N'ABC';
IF DB_ID(@dbname) IS NOT NULL THROW 51000, 'Existing Database.', 1;
PRINT 'New Database.';
CREATE DATABASE [ABC];
EXEC('
    USE ABC;
    CREATE TABLE [dbo].[Product_Container](
        [ProductID] [int] NOT NULL,
        [ContainerID] [int] NOT NULL,
        [AssociatedProductID] [int] NOT NULL
    ) ON [PRIMARY];
');
另一种方法是只制作两个脚本,然后使用batchfile或Powershell脚本逐个执行,同时考虑到第一个脚本引发的任何异常

第一个脚本创建数据库:

DECLARE @dbname nvarchar(128) = N'ABC';
IF DB_ID(@dbname) IS NOT NULL THROW 51000, 'Existing Database.', 1;
PRINT 'New Database.';
CREATE DATABASE [ABC];
第二个脚本创建表和其他数据库对象:

USE ABC;
CREATE TABLE [dbo].[Product_Container](
    [ProductID] [int] NOT NULL,
    [ContainerID] [int] NOT NULL,
    [AssociatedProductID] [int] NOT NULL
) ON [PRIMARY];
最后,提供一个示例批处理文件,将其全部放在一起:

@echo off
echo Script 1...
sqlcmd -b -E -i script1.sql
if errorlevel 1 goto end
echo Script 2...
sqlcmd -b -E -i script2.sql
if errorlevel 1 goto end
echo Successfully completed.
:end

标记您正在使用的dbms。该代码是特定于产品的。Go分割批处理如果您希望强制执行,您将必须使用Dynamic Sequel抱歉,我没有得到您