我有一个包含表名的表。 结构如下:
table_name
dbo.2017_10_8
dbo.2017_10_19
dbo.2017_10_30
dbo.2017_11_10
dbo.2017_11_21
dbo.2017_12_2
dbo.2017_12_13
dbo.2017_12_24
dbo.2018_1_4
dbo.2018_1_15
dbo.2018_1_26
dbo.2018_2_6
dbo.2018_2_17
dbo.2018_3_11
dbo.2018_2_28
我想创建名称为
的表格的表格dbo.2017_10_8_cs
dbo.2017_10_19_cs
dbo.2017_10_30_cs
dbo.2017_11_10_cs
dbo.2017_11_21_cs
dbo.2017_12_2_cs
dbo.2017_12_13_cs
dbo.2017_12_24_cs
dbo.2018_1_4_cs
dbo.2018_1_15_cs
dbo.2018_1_26_cs
dbo.2018_2_6_cs
dbo.2018_2_17_cs
dbo.2018_3_11_cs
dbo.2018_2_28_cs
我知道如果例如 t 包含第一个值块。 我可以
select table_name + '_cs' from t
然后我有我想要的格式的名称,但是如何使用具有第二个值块的表的名称创建所有表?提前谢谢
答案 0 :(得分:2)
您可以使用CURSOR
来循环每个表格。
DECLARE @SourceTableName VARCHAR(100)
DECLARE @DestinationTableName VARCHAR(100)
DECLARE TableNameCursor CURSOR FOR
SELECT
SouceTableName = QUOTENAME(table_name),
DestinationTableName = QUOTENAME(table_name + '_cs')
FROM
t
OPEN TableNameCursor
FETCH NEXT FROM TableNameCursor INTO @SourceTableName, @DestinationTableName
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @DynamicSQLCreate VARCHAR(MAX) = 'SELECT * INTO ' + @DestinationTableName + ' FROM ' + @SourceTableName
DECLARE @DynamicSQLDrop VARCHAR(MAX) = 'DROP TABLE ' + @SourceTableName
EXEC (@DynamicSQLCreate)
EXEC (@DynamicSQLDrop)
FETCH NEXT FROM TableNameCursor INTO @SourceTableName, @DestinationTableName
END
CLOSE TableNameCursor
DEALLOCATE TableNameCursor
请注意,我使用SELECT INTO
来创建新表。此命令将复制源表结构并使用其所有数据加载它,但不是它的索引或约束。
您可以切换EXEC
PRINT
以在实际执行前验证脚本。
修改强>
您可以使用系统存储过程sp_rename
将新表更改为原始表(一旦删除)。把它放在while循环中:
DECLARE @DynamicSQLCreate VARCHAR(MAX) = 'SELECT * INTO ' + @DestinationTableName + ' FROM ' + @SourceTableName
DECLARE @DynamicSQLDrop VARCHAR(MAX) = 'DROP TABLE ' + @SourceTableName
DECLARE @DynamicSQLRename VARCHAR(MAX) = 'EXEC sp_rename ' + @DestinationTableName + ' , ' + @SourceTableName
EXEC (@DynamicSQLCreate)
EXEC (@DynamicSQLDrop)
EXEC (@DynamicSQLRename)