首页 > 解决方案 > 对于 Informix 的不同 RHEL 版本,SQLCMD 版本输出不同

问题描述

我们使用“sqlcmd”来处理 Informix DB。我们的脚本使用“info columns for”命令来提取列并准备/运行查询。

但是,迁移到 RHEL7,最新版本的 SQLCMD 带有不同的输出模式。

Eg: RHEL6
$ echo "info columns for <table>" | dbaccess 2>&1 | head
1|<column 1>|258|4|0
2|<column 2>|7|4|0
3|<column 3>|0|2|0
... etc

RHEL7
$ echo "info columns for <table>" | dbaccess 2>&1 | head
colno              1
colname            <column 1>
coltype            258
collength          4
extended_id        0

colno              2
colname            <column 2>
coltype            7
collength          4

版本如下:

RHEL 6
$ dbaccess -V
dbaccess: SQLCMD Version 87.00 (2010-10-21)
IBM Informix CSDK Version 3.50, IBM Informix-ESQL Version 3.50.FC7
GNU Readline 6.0
(C) Copyright Jonathan Leffler 1987-2010
Licenced under GNU General Public Licence Version 2

RHEL 7
$ dbaccess -V
dbaccess: SQLCMD Version 90.02 (2016-07-28)
IBM Informix CSDK Version 4.10, IBM Informix-ESQL Version 4.10.FC2DE
GNU Readline 6.2
(C) Copyright Jonathan Leffler 1987-2016
Licenced under GNU General Public Licence Version 2

我们是否有使 sqlcmd 向后兼容的解决方案?是某种旗帜驱动的吗?我们必须支持 RHEL6 和 RHEL7。

标签: informix

解决方案


我只是有点偏见——我写了SQLCMD (1)

sqlcmd您从 90.02 版显示的输出反映了添加“块”模式输出格式以更好地模拟 DB-Access,并且当您通过 name使用时,该格式现在默认启用dbaccess

所以,是的,行为发生了变化。SQLCMD 90.02 现在比 87.00 更接近地模拟 DB-Access。

该问题也与 RHEL 6 与 RHEL 7 没有直接关系;它与 SQLCMD 的版本有关。

我不确定是否有一种简单的方法可以恢复旧行为。使用dbaccess -F select stores -不会覆盖现代版本中的默认值;format select;像命令一样运行。这是一个轻微的麻烦,但并不完全令人惊讶。我愿意dbaccess在命令行参数处理的其余部分之前设置名称隐含的格式模式,以便命令行选项覆盖隐含的格式。运行 SQLCMD viadbaccess -C会将其重新进入sqlcmd模式,但这意味着它不会像 DB-Access 那样解释数据库名称和文件名参数。(例如,在dbaccess模式下,.sql如果您不首先添加文件名,它会为文件名添加扩展名,就像 DB-Access 所做的那样;sqlcmd不这样做。)

“最佳”解决方案是修改脚本以直接使用 SQLCMD。然而,这意味着改变的不仅仅是命令名称;您必须-d在数据库名称之前添加并.sql为文件名添加后缀。

可以更改 SQLCMD 以添加一个环境变量,例如SQLCMD_FORMAT如果没有在命令行上显式覆盖,它就会生效。将其设置为select将恢复旧的输出格式。另一种可能性可能是添加对.sqlcmdrc包含要在启动时执行的命令的文件的支持。不过,我不相信我想添加它。

我建议通过电子邮件与我联系(请参阅 SQLCMD 文档或我的 SO 配置文件)以讨论从这里发生的事情 - 请在主题行中包含 SQLCMD。

顺便说一句,作为一种短期解决方法,没有什么可以阻止您在 RHEL 7 上使用 SQLCMD 87.00。或者,您可能会发现您需要编辑jlss.h以删除或更新memmem()87.00 代码中的声明,因为当时我不知道该函数在某些平台上可用——它既不是 C11 也不是 POSIX 2017 的一部分。const从返回类型中删除。当我使用 GCC 7.3.0 在 macOS 10.13.4 (High Sierra) 上编译 87.00 时,我收到了一些其他编译警告,但它们无害(无论它们多么不受欢迎)。但是 2010 年的代码不一定能在更现代的系统上编译得那么干净。


(1)该链接可能需要在 IIUG 注册。这是免费的,不需要大量的电子邮件——我估计通常每周不到一封——除非你选择订阅一些讨论频道。


推荐阅读