我在两个不同的数据库中有两个表。
我的第一个表是较旧的版本,并且比第二个表具有更少的列。
我想将旧表的内容复制到新表中。
在这种情况下,每个数据库表中都有多个分布。
如何快速将数据从旧表复制到新表,而不必手动为每个表编写列名?
谢谢!
下面的代码应该可以完成工作。基本上,它的作用是:
1.从两个表中收集列名。
2.与列名相交,以过滤出仅存在于1个表中的列。
3.获取一个字符串,该字符串是用逗号分隔的列名称。
4.使用阶段3中的字符串创建插入命令。
5.从阶段4执行命令。
--BEGIN TRAN
DECLARE @oldName NVARCHAR(50) = 'OldTableName', @newName NVARCHAR(50) = 'newTableName'
DECLARE @oldDBName NVARCHAR(50) = '[OldDBName].[dbo].['+@oldName+']', @newDBName NVARCHAR(50) = '[newDBName].[dbo].['+@newName+']'
/*This table variable will have columns that exists in both table*/
DECLARE @tCommonColumns TABLE(
ColumnsName NVARCHAR(max) NOT NULL
);
INSERT INTO @tCommonColumns
SELECT column_name --,*
FROM information_schema.columns
WHERE table_name = @oldName
AND COLUMNPROPERTY(object_id(@oldName), column_name, 'IsIdentity') = 0 --this will make sure you ommit IDentity columns
INTERSECT
SELECT column_name --, *
FROM information_schema.columns
WHERE table_name = @newName
AND COLUMNPROPERTY(object_id(@newName), column_name,'IsIdentity') = 0--this will make sure you ommit IDentity columns
--SELECT * FROM @tCommonColumns
/*Get the columns as a comma seperated string */
DECLARE @columns NVARCHAR(max)
SELECT DISTINCT
@columns = STUFF((SELECT ', ' + cols.ColumnsName
FROM @tCommonColumns cols
FOR XML Path('')),1,1,'')
FROM @tCommonColumns
PRINT @columns
/*Create tyhe insert command*/
DECLARE @InserCmd NVARCHAR(max)
SET @InserCmd =
'INSERT INTO '+@newDBName +' ('+@columns +')
SELECT '+@columns +' FROM '+@oldDBName
PRINT @InserCmd
/*Execute the command*/
EXECUTE sp_executesql @InserCmd
--ROLLBACK
请注意,如果您的FOREIGN KEY约束在旧表中已实现,而在新表中未实现,则此脚本可能会失败。
编辑:
查询已更新为省略Identity
列。
编辑2:
查询更新的支持不同的数据库的表(请确保您设置的@oldName
,@newName
,@oldDBName
,@newDBName
变量匹配实际凭据)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句