T-SQL - 是否有(免费)方法来比较两个表中的数据?

时间:2010-06-10 07:45:25

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

我有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列(TABLE B)以匹配同一IdFoo中TABLE A中的相应值。

请记住:

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

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

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

这个脚本将是一次性的。所以不需要做像链接服务器,复制等的事情。通过伙伴们欣赏答案。 =)

修改

好的 - 所以我选择了Oleg的答案(VS2010数据比较)。快速,简单,有魅力。

不要说其他答案不正确。我很感谢所有答案!

12 个答案:

答案 0 :(得分:6)

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

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

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

要详细了解该工具,您可以访问http://www.apexsql.com/sql_tools_datadiff.aspx

答案 1 :(得分:5)

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

MSDN - MERGE (Transact-SQL)

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:4)

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

最后Wikipedia有一个非常全面的软件列表。

答案 4 :(得分: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 and INTERSECT (Transact-SQL)

编辑2:

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

答案 5 :(得分:3)

我遇到了和你一样的问题 - 搜索了一个比较来自两个MS SQL表的数据的免费工具 - 什么都没找到。然后我创建了一个简单的免费软件命令行工具。它比较来自两个表的数据,并创建INSERT/DELETE/UPDATE statemenets以使目标表数据与源相同。现在我用它进行数据比较,因为它完全免费,可以建议查看:Sourceforge.net - UltraDBC

答案 6 :(得分:2)

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

答案 7 :(得分:1)

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

此工具不是免费的(它是共享软件),但您可以免费使用30天试用版,此外,您还有机会获得此产品的免费许可 - 请参阅我们的free license conditions page。< / p>

答案 10 :(得分:0)

如果您:

会发生什么
  1. 将devTableA复制到prod,
  2. 暂停对prodTableB的依赖
  3. 将prodTable B重命名为prodTableB1,
  4. 将devTableA重命名为prodTableB
  5. 重新实现对新prodTableB的依赖
  6. 测试新prodTableB,然后删除名为old prodTableB
  7. 或者如果您必须更加尊重现有的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
    

答案 11 :(得分:0)

您还可以查看xSQL Data Compare。 SQL Express版本是免费的,还有一个Lite版本可以为小型数据库提供技巧。

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

免责声明:我与xSQL有联系。