如何使用类似的'创建重复的表格表格列的名称?

时间:2018-03-14 12:08:55

标签: sql-server tsql

我有一个包含表名的表。 结构如下:

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

然后我有我想要的格式的名称,但是如何使用具有第二个值块的表的名称创建所有表?提前谢谢

1 个答案:

答案 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)