2017-06-06 56 views
0

我有2个表corporatecorporate_copy。最初它们在结构上是相同的,但人们开始在corporate中添加新列,并且忘记了corporate_copy修改表结构以匹配副本表

在应用程序的某处有较少使用的功能,将corporate中的数据复制到corporate_copy,并且在没有人注意的情况下保持失败。现在我必须添加28列(具有相同类型,长度和限制等的课程......)。

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

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

我在问很多,但有什么这样的吗?

+0

你想相同的数据以及在复制表? –

+0

数据不一样,结构相同 – Imad

回答

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 
+0

完美,只需要添加约束,我会做。谢谢:) – Imad

+0

@Imad欢迎兄弟 –

0

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

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

DROP TABLE Corporate_Copy; 

SELECT * 
INTO Corporate_Copy 
FROM Corporate; 

目前尚不清楚是否真的需要在副本中保存的数据。如果是这样,它不是一个副本吗?

+0

有疑问。我们可以在主表(对象)中使用'into'吗? – Coder1991

+0

我正在复制基于条件的行而不是整个表,并且此语句将失败,因为两个表现在具有不同的列。 – Imad

+0

@ Coder1991我不知道你的意思是“主表(物体)”。 –

0

从SQL-服务器2015年,您可以使用下面的查询,提取2分表间的所有不同的列:

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 .... 
+0

我使用ms excel做了它。但questiion是不同的。我想在副本中添加这些列。 – Imad

0

这应该使用SELECT INTO,例如下面的SQL语句可以创建企业备份副本:

SELECT * INTO corporate_copy 
FROM corporate ; 
0
  1. 产生SSMS CREATE脚本(桌子上单击鼠标右键,然后选择“脚本表作为.. 。“)
  2. 删除所有已存在的内容。通常他们是在开始时,这是一个简单的
  3. 变化CREATEALTER ... ADD