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

时间:2017-06-01 06:43:30

标签: sql-server tsql

我想创建一个sql脚本,它将在服务器上工作以检查数据库是否不存在然后创建新的,如果它存在则更新其表和SP。但问题是它不存在,它创建数据库,但表和sp已经转为master数据库。

样品。

    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

2 个答案:

答案 0 :(得分:0)

这是运行代码。

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;

答案 1 :(得分:0)

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

我建议多次分割脚本。 这意味着你必须摆脱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];
');

另一种方法是简单地制作两个脚本,然后使用批处理文件或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