Sql server 如何对生成的SQL脚本的输出进行排序?
我正在比较两个SQLServer数据库(development和live environment,分别是SQL2005和SQL2008),以检查两者之间的差异。如果我为每个数据库生成一个脚本,我可以使用一个简单的文本比较来突出显示差异 问题是脚本的顺序必须相同,以便于比较,并避免存储过程顺序不同但内容相同的简单差异 因此,如果我从开发中生成: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
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多个表、存储过程、视图等,很快就会变得一团糟
我目前的选择是:
我可以完全访问这两个环境,但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内置了此功能,我很抱歉