如何使用动态sql在最近创建的数据库中创建表?

时间:2016-06-13 09:26:10

标签: sql-server tsql dynamic-sql

我想以编程方式将一组表和过程填充到新数据库中。

然后我准备了一个Initialize Script,我将在必须创建新数据库的过程中使用它。

我尝试了一个简单的例子并且没有工作:

CREATE PROCEDURE PROCEDURETOREPLICATECOMMONSCHEMA
    @databaseName NVARCHAR(40)
AS
BEGIN
    DECLARE @sqlCreation NVARCHAR(MAX);
    SET @sqlCreation = '
        USE MASTER;

        EXEC(''CREATE DATABASE ' + @databaseName + ''');

        EXEC(''USE ' + @databaseName + ''');

        CREATE TABLE Testing
        (
            TestPk int,
            TestDescription nvarchar(80)
        );
    ';

    PRINT @sqlCreation;
    EXEC sp_executesql @sqlCreation;
END
GO

执行此过程时,它会在master数据库中创建表Testing而不是TestDatabase1

EXEC PROCEDURETOREPLICATECOMMONSCHEMA 'TestDatabase1'
GO

2 个答案:

答案 0 :(得分:3)

首先创建数据库,然后创建表(两个单独的语句):

CREATE PROCEDURE PROCEDURETOREPLICATECOMMONSCHEMA
    @databaseName NVARCHAR(40)
AS
BEGIN
    DECLARE @sqlCreation NVARCHAR(MAX);
    SET @sqlCreation = 'USE MASTER;
                        EXEC(''CREATE DATABASE ' + @databaseName + ''');';

    EXEC sp_executesql @sqlCreation;   

    SET @sqlCreation = 'EXEC(''USE ' + @databaseName + ''');

        CREATE TABLE ' + @databaseName + '.dbo.Testing
        (
            TestPk int,
            TestDescription nvarchar(80)
        );';

    EXEC sp_executesql @sqlCreation;
END
GO

enter image description here

答案 1 :(得分:0)

请使用以下代码。它与SQL Server 2012一起正常工作。

 CREATE PROCEDURE PROCEDURETOREPLICATECOMMONSCHEMA
    @databaseName NVARCHAR(40)
AS
BEGIN
   BEGIN
    EXEC('USE MASTER;CREATE DATABASE ' + @databaseName + ';')
    EXEC('CREATE TABLE ' + @databaseName + '.dbo.Testing(TestPk int,TestDescription nvarchar(80));')
END
END
GO