2016-06-13 73 views
0

我想以编程方式将一组表和过程填充到新的数据库中。如何使用动态sql在最近创建的数据库中创建表?

然后我准备了一个初始化脚本,我将在必须创建新数据库的过程中使用它。

我试图用一个简单的例子,并没有工作:

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 

当我执行这个程序,它会创建主数据库,而不是TestDatabase1表里面Testing

EXEC PROCEDURETOREPLICATECOMMONSCHEMA 'TestDatabase1' 
GO 

回答

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

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