我有table a
和table 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数据比较)。快速,简单,有魅力。
不要说其他答案不正确。我很感谢所有答案!
答案 0 :(得分:6)
迟到的答案但对线程访问者有用
除了其他提到的解决方案,我可以建议尝试ApexSQL Data Diff。它可以比较和同步SQL Server数据库数据(在实时数据库和备份中),并自动化和计划数据迁移。它也适用于大型数据库,并且能够直接从SSMS进行比较。
您可以免费下载此工具并使用它。它具有功能齐全的免费试用版,并提供适用于SQL Express和Azure SQL数据库的社区版(试用期结束后)。
要详细了解该工具,您可以访问http://www.apexsql.com/sql_tools_datadiff.aspx
答案 1 :(得分:5)
如果您只想同步表而不关心提前查看更改,MERGE命令可以执行此操作。
(免费)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(虽然不是免费的),还有SMO和built 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
现在您可以将这些记录插入某个临时表中,然后执行插入/更新。
根据您的需要,您可以限制字段列表进行比较。
请注意,您需要使用主键才能生效。
修改强>
糟糕! 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)
如果您:
会发生什么
或者如果您必须更加尊重现有的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有联系。