我正在尝试使用另一个表中的信息动态创建表。
例如,有一个表(例如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'表中的名称动态创建所有表?
答案 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;