我有2个表corporate
和corporate_copy
。最初它们在结构上是相同的,但是人们开始在corporate
中添加新列并且忘记对corporate_copy
执行此操作。
在应用程序的某个地方,使用较少的功能可以将数据从corporate
复制到corporate_copy
并且在没有人注意的情况下仍然会失败。现在我必须添加28列(当然具有相同的类型和长度以及约束等等。)。
我知道可以在一个ALTER TABLE
声明中完成,但我仍然觉得这是一项冗长的任务。
我们是否有任何奢侈品可以通过保留数据并在新添加的列中添加默认值来使复制表与主表相同?
我问的很多,但有什么相似的吗?
答案 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
输出为您提供了足够的信息来创建一个简单的脚本来添加缺少的列:
例如:
Alter table tbl_A ADD res.Column_Name res.Data_Type ....
答案 3 :(得分:0)
应该可以使用SELECT INTO
,例如以下SQL语句创建公司的备份副本:
SELECT * INTO corporate_copy
FROM corporate ;
答案 4 :(得分:0)
CREATE
脚本(右键单击表,然后“脚本表为......”)CREATE
更改为ALTER ... ADD