2011-10-10 39 views
6

我比较两个SQL服务器数据库(分别为开发和实时环境,SQL2005和SQL2008)以检查两者之间的差异。如果我为每个数据库生成一个脚本,我可以使用简单的文本比较来突出显示差异。如何对生成的SQL脚本的输出进行排序?

问题是脚本需要采用相同的顺序以简化比较,避免存储过程顺序不同但内容相同的简单差异。

所以,如果我生成这个从发展:

1: CREATE TABLE dbo.Table1 (ID INT NOT NULL, Name VARCHAR(100) NULL) 
2: CREATE TABLE dbo.Table2 (ID INT NOT NULL, Name VARCHAR(100) NULL) 
3: CREATE TABLE dbo.Table3 (ID INT NOT NULL, Name VARCHAR(100) NULL) 

这从现场:

1: CREATE TABLE dbo.Table1 (ID INT NOT NULL, Name VARCHAR(100) NULL) 
2: CREATE TABLE dbo.Table3 (ID INT NOT NULL, Name VARCHAR(100) NULL) 
3: CREATE TABLE dbo.Table2 (ID INT NOT NULL, Name VARCHAR(100) NULL) 

两条相比较亮点线2和3不同,但他们实际上是相同的,只是生成脚本向导在实时环境的表2之前执行了table3。添加100个表格,存储过程,视图等,这很快就变成了一团糟。

我目前的选择是:

  1. 手动比较
  2. 前的内容进行排序创建一个程序在一个特定的顺序
  3. 找到一个免费的应用程序,排序生成的脚本来创建脚本
  4. 支付作为其套件工具的一部分的产品
  5. (其他方式)

希望我只缺少说“按名称排序脚本”的复选框,但我看不到任何这样做。我认为我不应该为“排序输出”选项或许多其他不需要的工具这样简单的事情付费,所以选项4应该是最后的选择。

编辑 我有充分的机会,以两个环境,但生活环境被锁定和托管虚拟服务器上,具有远程desktoping访问现场的典型方式。我的首选是将我能做的事复制到那里进行开发和比较。我可以为数据库中的每种对象生成脚本作为单独的文件(表格,SP,函数等)

+0

您可能在通过查找CREATE脚本中的文本差异来比较数据库模式时遇到问题,但也许只是像使用Notepad2或其他东西来首先对所有行进行排序? –

+0

@Mike:如果他按字母顺序对脚本中的所有行进行排序,他将如何分辨不同的对象是什么? – codeulike

+0

任何文件比较工具,如“fc”.. –

回答

6

根据您的Visual Studio版本(如果有的话),可以这样做轻松通过数据菜单,根据您的原意,您可以节省一些时间。

编辑:生成实际DB的,然后比较,如下图所示的模式比较工具是比较两个脚本文件相同的净效果,你不必再担心换行等

enter image description here

+0

我得到了OP想要比较模式创建脚本的感觉,而实际上并没有要比较的实时数据库。 –

+1

他可以运行这两个脚本,让他们创建两个数据库,然后比较模式:)相同的净效果 – kd7

+0

我可以完全访问这两种环境,但不能从Visual Studio中访问:Live托管在虚拟服务器上,并且(正确如此)被锁定以防止外部访问。创建两个数据库有点费用,但仍是另一种选择。 –

0

这对脚本来说很难做到 - 因为SQL倾向于按照对其有意义的顺序(例如依赖顺序)而不是按字母顺序生成表/对象。

当您开始比较数据库时会出现其他复杂情况 - 例如约束对象的名称可能会随机生成,因此同一约束可能在每个数据库中具有不同的名称。

你最好的选择可能是选项(4)恐怕...一个虚拟的Red Gate Sql Compare - 免费30天的副本。我已经使用了很多,并且非常善于指出重要的差异。然后,它会生成一个脚本,使两个模式重新同步。

编辑:或Visual Studio 2010旗舰版(或溢价)可以做到这一点显然是 - 看KD7的答案

+0

vs2010溢价有这个内置,我敢肯定其他一些版本也有它 – kd7

+0

我不知道,这就是为什么我upvoted你的答案:) – codeulike

+0

是的,我从来没有听说过很多新闻,它是惊喜时我在那里看到了哈 – kd7

2

Red_gate的SQLCompare是利用这一点,值得每一分钱的最好的事情。

0

我有类似的问题。我的数据库是SQL Server 2008.我意识到,如果我通过对象资源管理器详细信息生成脚本,那么我会得到我正在查看名称的那个命令。通过这种方式,我能够比较两个数据库并找出它们的差异。

与此唯一的问题是,我不得不拿出单独的脚本为表/存储过程,触发器等

但我们可以很容易地进行比较。

1

您可以在某种程度上使用WinMerge来比较两个生成的脚本时是否在其他地方找到这些行。我认为它适用于更简单的情况。

使用WinMerge v2.12.4.0 Unicode。请注意下面突出显示的颜色用法。

下面是编辑的帮助 - >选项 - >比较 “启用移动块检测”:

3.6。启用移动的块检测 禁用(默认):WinMerge不会 检测差异是否由于移动的行导致。

已启用:WinMerge会尝试检测移动的行(在每个文件中的不同位置 )。移动的块由Moved和 指定移动的不同颜色指示。如果显示位置栏,则 中的对应差异位置在左侧和右侧位置栏 中用线连接。如果没有太多,显示移动的块可以更容易地将文件中的更改可视化为 。

有关示例,请参阅比较合并文件中的位置窗格说明和 合并文件。

相关问题