如何在SQL Server中动态创建表?

时间:2019-02-08 20:11:27

标签: sql-server azure-sql-database azure-sqldw

我正在尝试使用另一个表中的信息动态创建表。

例如,有一个表(例如table1),其中包含有关要创建的表列表的信息。我想使用此table1使用模式St.动态创建新表,并在名称末尾包含_New def,即我想在表1中创建表'St.TableA_New'而不是表名称'TableA' 。这是我使用的代码。

declare @table1 table(idx int identity(1,1), table_name varchar(50))
insert into @table1 (table_name)
select'TableA'  union
select'TableB' union
select'TableC' 

DECLARE @COUNT INT = 1;
WHILE @COUNT <= (select count(*) from @table1)
BEGIN
  Declare @table_name varchar(200) = (select table_name from @table1 where idx=@COUNT);
  Declare @new_table varchar(50) = 'St.+'@table_name+'_New';
  IF OBJECT_ID(@new_table) IS NOT NULL 
   DROP TABLE @new_table;

CREATE TABLE @new_table
WITH   
(   
    DISTRIBUTION = ROUND_ROBIN,
    HEAP
)  
AS 
    SELECT * 
    FROM [Ext].[@table_name]
    OPTION (LABEL = '');
SET @COUNT = @COUNT + 1
END;

错误显示“ @@ newtable附近的语法不正确”。在'DROP TABLE @new_table;'中期待'。',ID,IF或QUOTED_ID'。线。如何使用'table1'表中的名称动态创建所有表?

1 个答案:

答案 0 :(得分:0)

可以使用sp_executesql执行此操作。只需撤消下面的评论即可。您可能还需要为模式名称添加代码。

declare @table1 table(idx int identity(1,1), table_name varchar(50))
insert into @table1 (table_name) values ('TableA'), ('TableB'), ('TableC');

Declare @table_name varchar(200)
    , @new_table varchar(50)
    , @sql nvarchar(1000);

DECLARE @COUNT INT = 1;
WHILE @COUNT <= (select count(*) from @table1)
BEGIN
    select @table_name = table_name from @table1 where idx=@COUNT;
    set @new_table = @table_name + '_New';

    set @sql = concat('drop table if exists ', quotename(@new_table), ';');
    set @sql = @sql + 'CREATE TABLE ' + quotename(@new_table) + ' WITH(DISTRIBUTION = ROUND_ROBIN, HEAP) AS SELECT * FROM ' + quotename(@table_name) + ' OPTION (LABEL = '''')';

    print @sql;
    --exec sys.sp_executesql @sql;

    SET @COUNT = @COUNT + 1
END;