更改表结构以匹配副本表

时间:2017-06-06 12:58:01

标签: sql sql-server

我有2个表corporatecorporate_copy。最初它们在结构上是相同的,但是人们开始在corporate中添加新列并且忘记对corporate_copy执行此操作。

在应用程序的某个地方,使用较少的功能可以将数据从corporate复制到corporate_copy并且在没有人注意的情况下仍然会失败。现在我必须添加28列(当然具有相同的类型和长度以及约束等等。)。

我知道可以在一个ALTER TABLE声明中完成,但我仍然觉得这是一项冗长的任务。

我们是否有任何奢侈品可以通过保留数据并在新添加的列中添加默认值来使复制表与主表相同?

我问的很多,但有什么相似的吗?

5 个答案:

答案 0 :(得分:1)

--Generate a dynamic query which contain all the missing column list and Execute it
--for eg I tried Something

    BEGIN TRAN

    DECLARE  @SqlSelect NVARCHAR(MAX),@ColumnDeclaration VARCHAR(2000)

    SELECT DISTINCT ' '+COLUMN_NAME+' '+ DATA_TYPE +' '+ISNULL(CONVERT(NVARCHAR(10), CHARACTER_MAXIMUM_LENGTH ),'')+' 'Missing_Column INTO #T FROM INFORMATION_SCHEMA.COLUMNS a
    WHERE a.column_name not in (SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS b
    WHERE b.table_name in ('Corporate_Copy'))
    and a.table_name in ('Corporate')



    SELECT @ColumnDeclaration=STUFF((
                                SELECT ', ' + Missing_Column 
                                FROM #T
                                FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(max)'), 1, 1, '')

    SET @SqlSelect=' ALTER TABLE Corporate_Copy  Add'+ @ColumnDeclaration + ');'
    PRINT @SqlSelect


    ROLLBACK TRAN

答案 1 :(得分:0)

您可以使用SQL Server数据工具(免费)中的模式比较来自动生成更改脚本。

但如果这只是一个副本,你可以运行它:

DROP TABLE Corporate_Copy;

SELECT *
INTO Corporate_Copy
FROM Corporate;

目前尚不清楚您是否真的需要保留副本中的数据。如果是这样,它不是真正的副本吗?

答案 2 :(得分:0)

从SQL-Server 2015,您可以使用以下查询来提取两个表之间的所有不同列:

select distinct a.* from INFORMATION_SCHEMA.COLUMNS a
where a.column_name not in (select column_name from INFORMATION_SCHEMA.COLUMNS b
where b.table_name in ('tbl_A'))
and a.table_name in ('tbl_B')
order by a.column_name

输出为您提供了足够的信息来创建一个简单的脚本来添加缺少的列:

enter image description here

例如:

Alter table tbl_A ADD res.Column_Name res.Data_Type ....

答案 3 :(得分:0)

应该可以使用SELECT INTO,例如以下SQL语句创建公司的备份副本:

SELECT * INTO corporate_copy
FROM corporate ;

答案 4 :(得分:0)

  1. 在SSMS中生成CREATE脚本(右键单击表,然后“脚本表为......”)
  2. 删除所有已存在的内容。通常他们都在开始,这很简单
  3. CREATE更改为ALTER ... ADD