8

我有table atable b。(SQL Server 2008)

两个表具有完全相同的架构。

出于此问题的目的,请考虑table a= 我的本地开发表,table b= 实时表。

我需要创建一个 SQL 脚本(包含UPDATE/DELETE/INSERT语句),它将表 b 更新为与表 a 相同。然后,此脚本将部署到实时数据库。

有没有可以做到这一点的免费工具,或者更好的方法是我自己可以做到这一点?

我在想我可能需要对表中的所有字段进行某种类型的连接,然后基于此生成动态 SQL。

有人有想法么?

编辑

好的,我想我会稍微澄清一下这个问题。

我需要同步的表是一个简单的查找表。数据非常简单明了。

TABLE A这是一个可能看起来像的想法:

IdFoo          Activity      IsFoo
1              Foo           1
2              Bar           0

TABLE B这是一个可能看起来像的想法:

IdFoo          Activity      IsFoo
1              Foo           1
2              Bar           1

基本上,我要做的就是更新该BIT列 ( IsFoo)以匹配同一 IdFooTABLE B中的相应值。TABLE A

记住:

  • TABLE A在我的本地机器上
  • TABLE B在实时服务器上

显然,我TABLE B在本地机器上有一个(可靠的)备份,我需要针对它编写脚本,然后在实时服务器上运行脚本。

该表还具有参照完整性(我没有显示的其他列)。这意味着我不能只删除其中的所有内容TABLE B并从中插入TABLE A

这个脚本将是一次性的。因此,无需执行链接服务器、复制等操作。感谢各位的回答。=)

编辑:

好的 - 所以我接受了 Oleg 的回答(VS2010 数据比较)。快速,简单,而且很有魅力。

并不是说其他​​答案不正确。我感谢所有的答案!

4

12 回答 12

6

迟到的答案,但可能对线程访问者有用

除了其他提到的解决方案,我可以建议尝试 ApexSQL Data Diff。它可以比较和同步 SQL Server 数据库数据(在实时数据库和备份中),并自动执行和安排数据迁移。它也适用于大型数据库,并且能够直接从 SSMS 执行比较。

您可以免费下载此工具并使用它。它具有功能齐全的免费试用版,并提供适用于 SQL Express 和 Azure SQL 数据库的社区版(试用期结束后)。

要了解有关该工具的更多信息,您可以访问http://www.apexsql.com/sql_tools_datadiff.aspx

于 2016-06-22T12:54:22.547 回答
5

如果您只想同步表而不关心提前查看更改,则MERGE命令可以执行此操作。

MSDN - 合并 (Transact-SQL)

(免费)Microsoft SSDT 还内置了数据比较和同步功能,尽管它比 Redgate 数据比较等付费工具更受限制。

于 2010-06-10T08:02:45.947 回答
5

在非常简单的情况下,您将能够在本地 SQL Server 中定义一个新的链接服务器(请参阅 Microsoft SQL Server Management Studio 中的“服务器对象”/“链接服务器”)并使用INNER JOINOUTER JOIN找出 A 和 B 表之间的差异.

在真实且更复杂的情况下,您应该考虑目标数据库中存在的引用完整性、不同的外键和身份(自动增量)字段,因此更新脚本会更复杂。因此,我建议您不要将时间花在创建开发人员和生产数据库的同步上,而是使用标准工具。例如,我使用 Visual Studio Team Edition 2008(或数据库版)或 Visual Studio 2010 Ultimate 版的功能来比较两个数据库中的数据。它工作得很好。

于 2010-06-10T09:08:38.380 回答
4

有来自 RedGate 的SQL 数据比较(虽然不是免费的),还有SMO内置功能。

最后,维基百科有一个相当全面的软件列表。

于 2010-06-10T07:51:17.540 回答
3

由于它是一次性的,因此您可以使用此查询来查找这两个表中不同的行:

(SELECT * FROM TABLE_A
 MINUS
 SELECT * FROM TABLE_B)

 UNION ALL

(SELECT * FROM TABLE_B
 MINUS
 SELECT * FROM TABLE_A)

MINUS将逐个字段比较记录,然后它将丢弃第一个表中第二个表中有相同记录的记录。这像这样工作:

  • 首先MINUS获取所有TABLE_A不在的记录TABLE_B
  • 第二个MINUS获取所有TABLE_B不在的记录TABLE_A
  • Union 从两个表中获取其他表中没有匹配记录的所有记录。

现在您可以在一些临时表中插入这些记录,然后进行插入/更新。

根据您的需要,您可以限制字段列表进行比较。

请注意,您需要主键才能正常工作。

编辑:
哎呀。SQL Server 不支持MINUS运算符。去年半我在使用 ORACLE,所以这是自动的。

您可以改用EXCEPT运算符。请参阅这篇文章:EXCEPT 和 INTERSECT (Transact-SQL)

编辑2:

Re scherand 的评论:
如果他真的无法从本地机器连接到实时服务器,那么他可以简单地将其转储TABLE_A并加载到服务器上。一种或另一种方式,目标是更改实时服务器上的表数据。

于 2010-06-10T10:00:50.017 回答
3

我遇到了和你一样的问题——搜索了一个比较两个 MS SQL 表中数据的免费工具——但什么也没找到。然后我创建了一个简单的免费命令行实用程序。它比较两个表中的数据,并创建INSERT/DELETE/UPDATE语句以使目标表数据与源表数据相同。现在我用它来比较数据,因为它是完全免费的,可以推荐去看看:Sourceforge.net - UltraDBC

于 2012-11-01T15:12:08.117 回答
2

您可以使用为插入创建脚本的数据脚本生成器,然后使用 WinMerge 等文件比较工具来比较文件以找出差异。有一篇关于在代码项目上生成数据脚本的文章:http: //www.codeproject.com/KB/database/sqlinsertupdategenerator.aspx

于 2010-06-10T07:53:51.300 回答
1

Tablediff 可以工作 - 它是免费的,并且附带 SQL Server http://msdn.microsoft.com/en-us/library/ms162843.aspx

于 2011-10-04T13:23:00.750 回答
0

您也可以尝试使用 import and export dataSQL Server 2008 提供的。它是一种相当直接的方法,可以将所有数据从任何地方复制到任何地方。我做同样的事情并且完美地工作。

于 2010-06-10T08:32:47.723 回答
0

您可以尝试我们的 SQL Server 架构比较

此工具不是免费的(它是共享软件),但您可以免费使用 30 天试用版,并且您有机会获得此产品的免费许可证 - 请参阅我们的免费许可证条件页面

于 2010-09-23T11:48:15.650 回答
0

如果您:

  1. 将 devTableA 复制到产品上,
  2. 暂停对 prodTableB 的依赖
  3. 将 prodTable B 重命名为 prodTableB1,
  4. 将 devTableA 重命名为 prodTableB
  5. 重新实现对新 prodTableB 的依赖
  6. 测试新的 prodTableB,然后删除已命名的旧 prodTableB

?

或者如果您必须更加尊重现有的 prodTableB 以及您在 dev 和 prod 中的标识列值匹配(即使这些值不连续)......

declare @iLast int, @x int, @y int
select @iLast = (select MAX(id) from prodTableB)
set @x = 1
while @x <= @iLast
begin
  select @y = (select COUNT(*) from prodTableB where id = @x)
  if @y = 1
    begin
      update prodTableB set isFoo = (select isFoo from devTableA where id=@x
    end
  @x=@x+1
end
于 2013-04-18T15:37:34.120 回答
0

您还可以查看xSQL 数据比较。SQL Express 版本是免费的,还有一个 Lite 版本可以解决小型数据库的问题。

一个很好的免费工具也是来自SSDT的数据比较。

免责声明:我隶属于 xSQL。

于 2016-10-20T07:43:45.950 回答