24

我经常需要比较 SQL 过程以确定最新版本中发生了什么变化。问题是,每个人都有自己的格式化风格,SQL(通常)不关心换行符放在哪里(例如,where 子句都在一行上,而每个 AND 之前的换行符)。

这使得很难看到实际差异(尤其是对于长程序)。我似乎找不到一个免费的 diff/merge 实用程序可以让我忽略换行符(即视为空格)。到目前为止,我已经尝试过 WinMerge 和 Beyond Compare,但没有任何运气。有谁知道可以将这两个示例视为相同的差异工具(最好是免费的)?

前任。1:

the quick
brown

前任。2:

the
quick
brown

提前致谢。

4

12 回答 12

11

我真的很喜欢SourceGear 的 DiffMerge

它适用于所有平台并内置规则集,但允许您创建和添加自己的规则集。这意味着你可以在你想要的时候忽略你想要的。

奖金,它是免费的!

于 2010-11-05T20:39:21.337 回答
7

我在自己的类似案例中所做的是使用sql prettifier,它将以非常相似的方式自动组织两组半不同的 SQL。然后我粘贴并将结果与​​ WinMerge 进行比较。

这是一个两步的过程,但它比许多其他选项更可口,尤其是在涉及许多代码行的情况下。

链接到不错的基于 Web 的 Sql Pretty 打印机

于 2009-11-20T21:27:51.123 回答
3

Compare++是一个选项,您可以在“智能”菜单中尝试“忽略代码样式更改”。它支持多种语言的结构化比较,例如 C/C++、JavaScript、C#、Java...

于 2011-07-05T00:08:35.097 回答
2

我喜欢 Araxis 合并。不是免费的,但很值得。除其他外,它可以根据需要忽略任何类型的空格。

于 2009-11-20T21:27:01.173 回答
2

您可以使用 Eclipse IDE 的 DTP(数据工具项目)。

为了展示它,我创建了两个几乎相同的 SQL 文件,并让 eclipse 向我展示它们的差异。单击“显示下一个”后,我截取了屏幕截图。

正如您所看到的,它仍然突出显示换行符,但顺便说一句,您可以立即看到它们不包含对 SQL 的实质性更改。很容易发现我将 ID 从 1 更改为 2 的位置。

这是结果。

替代文字 替代文字 替代文字

于 2010-11-07T23:59:50.980 回答
2

无论您对“免费”(啤酒与语音/自由)的定义如何,Poor Man 的 T-SQL 格式化程序也可用于执行此操作,无论是使用 WinMerge(使用 winmerge 插件)还是 Beyond Compare 和其他允许命令的比较工具 -行预格式化,使用命令行批量格式化程序。

如果您更喜欢在不下载任何东西的情况下试一试,它可以立即在线使用(如它的非自由对应物 T-SQL Tidy、Instant SQL Formatter 等):

http://poorsql.com

于 2012-02-23T12:48:14.923 回答
1

我们的SD Smart Differencer根据其精确的语法和结构而不是根据原始文本来比较两个源程序。它通过以编译器的方式解析(SQL)源代码并比较相应的编译器数据结构(例如,抽象语法树)来做到这一点。因此,SmartDifference 不关心换行符、空格或介入注释。

它报告的差异不是换行,而是编程语言结构(变量、表达式、语句、块、函数……)和接近程序员意图的术语(删除、插入、移动、复制、重命名)而不是行插入或行删除。

SQL(与许多其他计算机语言名称一样)是一系列计算机语言的名称,它们在语法上相似但在细节上有所不同。因此,对于 Smart Differencer,使用的 SQL 方言很重要。我们有用于 PLSQL 和 SQL2011 的 SQL 前端(因此是 SmartDifferncers)。只要您的 SQL 保持在其中任何一个范围内,Smart Differencer 就可以为您工作;就您使用 SQL Server 或 Postgres 的额外好处而言,SmartDifferencer 目前无法帮助您。[我们开发语言解析器作为我们业务的一部分,所以我希望这是一个延迟问题,而不是永远不会]。

虽然 OP 详细询问了 SQL,但他的标题问题与语言无关。除了 SQL 之外,许多其他广泛使用的语言也已经有了 SmartDifferencers:C、C++、C#、Java ......

于 2010-11-05T22:54:09.243 回答
1

另一种选择是 Emacs 的 Ediff。如果你不害怕 Emacs,那就太好了。

于 2010-11-10T00:34:39.147 回答
1

您可以使用命令行工具wdiff忽略换行符。wdiff是一个 GNU 工具,用于逐字比较文件。-n它可以使用该选项忽略换行符。

假设我将您的 2 个示例文件放入 ex1.txt 和 ex2.txt。然后我们可以运行:

$> wdiff -n ex1.txt ex2.txt
the
quick
brown

输出实际上是第一个文件的内容。请注意,没有 + 或 - 符号,这意味着文件具有相同的字符串。

如果我在 ex1.txt 的末尾添加了“fox”,那么输出将如下所示:

the
quick
brown [-fox-]

如果看到常用词仍然困扰您,您可以添加-3--no-common。这是我在第一个文件中添加“fox”的示例:

$> wdiff -n -3 /tmp/ex1.txt /tmp/ex2.txt

======================================================================
 [-fox-]
======================================================================
于 2016-10-07T15:31:17.303 回答
0

PHPStorm 的 diff 工具的“忽略空格:全部”命令可以按照您的意愿完美完成。它集成了对许多VCS如SVN、git等的支持。以及集成的SQL支持!

不是免费的,但时间也不是免费的。想浪费时间做艰难的事情吗?前进。

我仍然不敢相信这是 2014 年,这不是所有差异工具的标准功能!

顺便说一句,我相信 WebStorm 的 diff 工具也可以工作。

于 2014-03-03T21:42:30.390 回答
-1

如果你在 Windows 上,WinMerge是相当漂亮的。在 Linux(可能还有 OS X)下,有Meld

两者都像啤酒一样免费,而且效果很好。不如 Araxis 酷,但我们不希望你在办公桌上流口水。

两者都是通用的差异工具,具有忽略空白等功能。我不能绝对肯定他们会忽略空白行,但他们很有可能会这样做。

于 2009-11-20T21:58:03.957 回答
-1

你试过KDiff吗?我敢肯定你可以用它忽略空格,如果它对你来说不够强大,它允许你在文件上运行预处理器。最重要的是它是免费开源的。

于 2010-11-09T16:43:54.187 回答