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