如何对生成的SQL脚本的输出进行排序?

时间:2011-10-10 15:33:29

标签: sql-server sql-server-2005 sql-server-2008

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

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

所以如果我从开发中生成这个:

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. (其他一些方法)
  6. 希望我只是错过了“按名称排序脚本”的复选框,但我看不到任何可以做到这一点的内容。我觉得我不应该为“排序输出”选项或许多其他不需要的工具付出简单的代价,因此选项4应该是最后的选择。

    修改的 我可以完全访问这两种环境,但实时环境被锁定并托管在虚拟服务器上,远程桌面是实时访问的典型方式。我的偏好是将我可以复制到开发中并进行比较。我可以为数据库中的每种类型的对象生成脚本,作为单独的文件(表,SP,函数等)

4 个答案:

答案 0 :(得分:6)

根据您的Visual Studio 2010 版本(如果有的话),您可以通过数据菜单轻松完成此操作,根据您的原始意图,您可以节省一些时间。

编辑:生成实际数据库然后比较下面显示的模式比较工具与比较两个脚本文件具有相同的净效果,您不必担心换行符等。< / p>

enter image description here

答案 1 :(得分:2)

Red_gate的SQLCompare是最好用的,值得每一分钱。

答案 2 :(得分:1)

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

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

以下是编辑的帮助 - &gt;选项 - &gt;比较“启用移动块检测”:

  

3.6。启用移动块检测   禁用(默认):WinMerge没有   检测何时差异是由移动的线条引起的。

     

启用:WinMerge尝试检测移动的行(不同的行)   每个文件中的位置)。移动块由Moved和表示   选择Moved差异颜色。如果显示位置栏,   左右位置条中的相应差异位置   用一条线连接起来。显示移动的块可以使其更容易   如果没有太多,可视化文件中的更改。

     

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

答案 3 :(得分:0)

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

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

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

编辑:或者Visual Studio 2010 Ultimate(或Premium)显然可以做到 - 请参阅kd7的回答