Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何对生成的SQL脚本的输出进行排序?_Sql Server_Sql Server 2005_Sql Server 2008 - Fatal编程技术网

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

Sql server 如何对生成的SQL脚本的输出进行排序?,sql-server,sql-server-2005,sql-server-2008,Sql Server,Sql Server 2005,Sql Server 2008,我正在比较两个SQLServer数据库(development和live environment,分别是SQL2005和SQL2008),以检查两者之间的差异。如果我为每个数据库生成一个脚本,我可以使用一个简单的文本比较来突出显示差异 问题是脚本的顺序必须相同,以便于比较,并避免存储过程顺序不同但内容相同的简单差异 因此,如果我从开发中生成: 1: CREATE TABLE dbo.Table1 (ID INT NOT NULL, Name VARCHAR(100) NULL) 2: CREAT

我正在比较两个SQLServer数据库(development和live environment,分别是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之前执行了表3。再加上100多个表、存储过程、视图等,很快就会变得一团糟

我目前的选择是:

  • 比较前手动对内容进行排序
  • 创建一个程序以按特定顺序创建脚本
  • 查找对生成的脚本进行排序的免费应用程序
  • 为作为其工具套件一部分的产品付费
  • (其他方法)
  • 希望我只漏掉了“按名称对脚本排序”的复选框,但我看不到任何这样做的内容。我不觉得我应该为“排序输出”选项或其他许多不需要的工具这样简单的东西付费,所以选项4应该是最后的选择

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

    取决于您的Visual Studio2010版本(如果您有),您可以通过“数据”菜单轻松完成此操作,根据您的原始意图,您可能会节省一些时间

    编辑:生成实际的数据库,然后如下图所示比较架构比较工具,与比较两个脚本文件具有相同的净效果,您不必担心换行等问题


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

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

    你最好的选择可能是选项(4)恐怕。。。一份评估副本-免费30天。我已经用过很多次了,它非常擅长找出重要的区别。然后,它将为您生成一个脚本,使这两个模式恢复同步


    编辑:或者Visual Studio 2010 Ultimate(或Premium)显然可以做到这一点-请参阅kd7的答案,Red_gate的SQLCompare是最好的选择,值得每一分钱。

    我也有类似的问题。我的数据库是SQLServer2008。我意识到,如果我通过对象资源管理器详细信息生成的脚本,那么我将获得查看名称的顺序。通过这种方式,我能够比较两个数据库并找出它们的差异

    唯一的问题是,我必须为表/存储过程、触发器等单独编写脚本


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

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

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

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

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

    已启用:WinMerge尝试检测移动的行(以不同的方式) 每个文件中的位置)。移动的块由移动的和 选择不同的颜色。如果显示位置栏, 左右位置栏中相应的差异位置 用一根线连接。显示移动的块可以更容易地 如果文件不太多,则可视化文件中的更改

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


    通过查找创建脚本中的文本差异,您可能会在比较数据库架构时遇到麻烦,但可能只是使用Notepad2或其他工具来首先对所有行进行排序?@Mike:如果他按字母顺序对脚本中的所有行进行排序,他将如何分辨不同的对象?任何文件比较工具,如“fc”…请编辑你的问题-你能先在一个实时数据库中创建两个模式吗?@Mike:我的意思是,每个脚本对象都跨越脚本的多行,所以按字母顺序对脚本进行排序将使其混乱不堪。例如,在“c”部分,你只会看到大量的行写着“create table foo”,而不知道该表中有哪些列。我感觉OP想要比较架构创建脚本,而实际上没有要比较的实时数据库。他可以运行这两个脚本,让他们创建两个数据库,然后比较模式:)相同的网络效果我可以完全访问这两个环境,但不能从Visual Studio访问:Live托管在虚拟服务器上,并且(正确地说)被锁定以防止外部访问。创建两个数据库有点开销,但仍然是另一种选择。因此,如果您可以为所有3个数据库编写脚本,为什么不在您有权访问的测试Sql Server上使用不同的名称创建它们,然后比较a->b,b->c。如果a=b和b=c,你很好,因为a=c。当然,您可以在内部连接到测试数据库服务器?vs2010 premium内置了此功能,我很抱歉