【问题标题】:T-SQL - Is there a (free) way to compare data in two tables?T-SQL - 是否有(免费)方法来比较两个表中的数据?
【发布时间】:2011-03-02 01:13:02
【问题描述】:

我有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

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

记住:

  • TABLE A 在我的本地机器上
  • TABLE B 在直播服务器上

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

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

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

编辑:

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

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

【问题讨论】:

  • 任何答案在很大程度上取决于您是否有一个可以可靠地用于匹配两行的字段。
  • 答案还取决于您需要执行此操作的频率以及数据量有多大?如果是一次性的,您可以使用导入/导出向导将table b 传输到table a。如果您希望立即和持续地反映更改,您可以实施复制。

标签: sql-server tsql sql-server-2008 sqlcompare


【解决方案1】:

回答较晚,但对话题访问者可能有用

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我有 VS2010 - 你如何比较两个数据库中的数据?你有参考/链接吗?
    • 只需进入菜单“数据”选择“数据比较”和“新数据比较”。然后选择源数据库和目标数据库以及“数据比较选项”。然后按照向导。最后,您可以检查比较结果,“消除”一些差异,然后将重新更改直接写入目标数据库或生成 SQL 脚本。在“工具”“选项”菜单中,您可以选择一些代码生成选项。您不仅可以比较数据,还可以根据需要比较数据库的架构。
    • 酷 - 好吧,明天我会试一试(当我回到工作岗位时),让你知道我的进展 - 为小费欢呼!
    • 您可以在msdn.microsoft.com/en-us/library/dd193261.aspx 下阅读有关在 Visual Studio 2010 中比较和同步数据的更多信息。顺便说一句,如果需要,您可以通过 DTE 自动化数据比较(请参阅blogs.msdn.com/b/psirr/archive/2008/11/22/…
    【解决方案3】:

    如果您只想同步表而不关心提前查看更改,MERGE 命令可以做到这一点。

    MSDN - MERGE (Transact-SQL)

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

    【讨论】:

      【解决方案4】:

      有来自 RedGate 的 SQL Data Compare(虽然不是免费的),还有 SMObuilt in 功能。

      终于Wikipedia有一个相当全面的软件列表。

      【讨论】:

      • RedGate SQL 数据比较工具不是免费的。 SMO 是个好主意,维基百科链接是一个很好的来源。
      • 对不起伯纳德我误读了部分问题,并以某种方式将其解释为免费虽然是可选的,但我已经编辑了答案以反映这一点。我想需要更多的咖啡。
      • 现在维基百科链接,烦人。只是重定向到主 SQL Server 页面。
      【解决方案5】:

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

      (SELECT * FROM TABLE_A
       MINUS
       SELECT * FROM TABLE_B)
      
       UNION ALL
      
      (SELECT * FROM TABLE_B
       MINUS
       SELECT * FROM TABLE_A)
      

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

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

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

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

      请注意,您需要主键才能使其工作。

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

      您可以改用EXCEPT 运算符。见这篇文章:EXCEPT and INTERSECT (Transact-SQL)

      编辑 2:

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

      【讨论】:

      • 有趣...从未听说过 MINUS 关键字。我也会尝试一下(是的 - 第一列是 PK - 身份)。
      • 这不起作用,除非 OP 可以将他/她的工作站/实时服务器定义为链接服务器(正如@Oleg 指出的那样)...引用:“请记住:表 A 在我的本地机器表 B 在实时服务器上”
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              【解决方案10】:

              您可以试试我们的Schema Compare for SQL Server

              此工具不是免费的(它是共享软件),但您可以免费试用 30 天,而且您有机会获得此产品的免费许可证 - 请参阅我们的free license conditions page

              【讨论】:

                【解决方案11】:

                如果你:

                1. 将 devTableA 复制到 prod,
                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
                

                【讨论】:

                  【解决方案12】:

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

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

                  免责声明:我隶属于 xSQL。

                  【讨论】:

                    猜你喜欢
                    • 2010-09-16
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-10-20
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多