Sql 标识数据库中的空白表,并从其他数据库中的另一个表插入数据

Sql 标识数据库中的空白表,并从其他数据库中的另一个表插入数据,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,实际场景:我有一个重复的数据库,想知道哪些表中的数据没有从原始数据库中移动。然后我想从原始数据库填充重复的数据库表 我实现了部分解决方案,即通过编写以下脚本查找空表: 现在我想填充空表中的数据。是否有一个单独的查询来完成这两件事,即1.找出哪些表需要填充,2。将数据从DBOrig填充到DBDupl。我用上面的脚本实现了1,不想手动插入数据。您想要数据库的精确副本吗?为什么不备份主备份并使用其他名称进行恢复 如果不可能,您可以使用SSI移动数据或类似的内容: insert into destDB.

实际场景:我有一个重复的数据库,想知道哪些表中的数据没有从原始数据库中移动。然后我想从原始数据库填充重复的数据库表

我实现了部分解决方案,即通过编写以下脚本查找空表:


现在我想填充空表中的数据。是否有一个单独的查询来完成这两件事,即1.找出哪些表需要填充,2。将数据从DBOrig填充到DBDupl。我用上面的脚本实现了1,不想手动插入数据。

您想要数据库的精确副本吗?为什么不备份主备份并使用其他名称进行恢复

如果不可能,您可以使用SSI移动数据或类似的内容:

insert into destDB.dbo.mytable
select * sourcedb.dbo.mytable
您可以使用脚本在空表中循环,并运行一些动态SQL来执行上面的命令。您可以:

我要一张桌子的清单

2对于每个表,从一个数据库插入到另一个数据库

仅供参考-如果您需要比较数据库,VisualStudio可以免费进行模式/数据比较

下面是一个示例脚本。它假定表结构相同。 您可以使用print生成脚本,也可以执行注释掉的命令

不计较 声明 @objectName nvarchar256 ,@sql nvarcharmax ,@db1 nvarchar100='DB_1' ,@db2 nvarchar100='DB_2' 如果存在空表,则删除表 ;使用c_空表作为 选择t.object\u id ,s.Name AS SchemaName ,t.Name作为TableName ,p.行作为行计数 ,FullName=CONCAT QUOTENAMEs.name ,'.' ,quotename.name ,CASTROUNDSUMa.used_pages/128.00,2为数字36,2为used_MB ,CASTROUNDSUMa.total_pages-SUMa.used_pages/128.00,2个作为数字36,2个作为未使用的_MB ,CASTROUNDSUMa.total_pages/128.00,2为数字36,2为总页数 从sys.t表 t.OBJECT\u ID=i.OBJECT\u ID上的内部联接sys.index i i.object\u id=p.object\u id上的内部联接sys.p分区 i.index\u id=p.index\u id p.partition\u id=a.container\u id上的内部连接sys.allocation\u units a t.schema\u id=s.schema\u id上的内部联接sys.schemas 其中ISNULLp.rows,0=0 按t.名称分组 ,s.Name ,p.Rows ,t.object\u id 挑选* 变成空表 从c_空表 声明当前光标本地快进 对于 选择全名 从空表t 开路电流 接下一个 从cur 进入 @对象名 而@@FETCH\u STATUS=0 开始 设置@sql='插入到“++@db1+”。++@objectName+CHAR10 +'从'+@db2+'中选择*。'+@objectName' +CHAR10+“开始”+CHAR10 PRINT@sql 开始尝试 开始交易 -EXEC@sql 提交事务; 结束尝试 开始捕捉 如果@TRANCOUNT>0 回滚事务; 打印字符10+“***更新***”失败; 打印CHAR10+@sql 打印字符10 选择 错误号作为错误号 ,ERROR\u严重性为ErrorSeverity ,ERROR_状态为ErrorState ,ERROR_过程作为ErrorProcedure ,ERROR_LINE作为ErrorLine ,错误消息作为错误消息; 端接 接下一个 从cur 进入 @对象名 终止 闭合电流 解除分配cur
我过去曾经拼凑过一些东西,它只为我生成了一个我只需要运行的SQL insert语句;但要注意的一点是标识列-首先删除identity属性,然后再恢复它。@AdrianWragg,我已经创建了重复的数据库。设置所有属性,处理标识列并重新设定种子。但我在传输数据时错过了一些专栏。现在我只想填充其余的列。如果你能告诉我黑客是如何工作的..只是想检查一下,是来自其他完整行的单个列没有被传输,还是一些表的全部内容?表的全部内容在这种情况下,我认为很简单,考虑到我知道表的结构,从DBOrig.dbo.myTable中选择“插入DBDupl.dbo.myTable值”、id、“+name+”。然后我将输出复制到另一个SQL窗口并运行它;这是一个一次性的工作,因为我怀疑你的可能是,所以代码质量和可重用性并不重要。
insert into destDB.dbo.mytable
select * sourcedb.dbo.mytable