我们正在使用" sqlcmd"用于使用Informix DB。我们的脚本使用" info列为"命令提取列并准备/运行查询。
然而,转移到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。
答案 0 :(得分:1)
我只是轻度偏见 - 我写了SQLCMD (1)。
您在版本90.02中显示的输出反映了“&#39;块”的添加。模式输出格式更好地模拟DB-Access,当您通过名称sqlcmd
使用dbaccess
时,默认情况下会启用该格式。
所以,是的,行为改变了。 SQLCMD 90.02现在比87.00更接近模拟DB-Access。
问题也与RHEL 6与RHEL 7没有直接关系;它与SQLCMD的版本有关。
我不确定是否有一种简单的方法可以恢复原来的行为。使用dbaccess -F select stores -
并不会覆盖现代版本中的默认值;以命令运行format select;
。这是一个轻微的麻烦,但并不完全令人惊讶。我希望在命令行参数处理的其余部分之前设置名称dbaccess
隐含的格式模式,以便命令行选项覆盖隐含格式。通过dbaccess -C
运行SQLCMD会将其恢复为sqlcmd
模式,但这意味着它不会像DB-Access那样解释数据库名称和文件名参数。 (例如,在dbaccess
模式下,如果您不首先添加.sql
扩展名,则会在文件名中添加sqlcmd
扩展名,如DB-Access所做的那样; -d
不这样做。)
最好的&#39;解决方案是修改脚本以直接使用SQLCMD。但是,这意味着更改的不仅仅是命令名称;您必须在数据库名称前添加.sql
,并在文件名中添加SQLCMD_FORMAT
个后缀。
可以更改SQLCMD以添加一个环境变量,例如select
,如果未在命令行上显式覆盖,则该变量生效。将其设置为.sqlcmdrc
将恢复旧的输出格式。另一种可能性是添加对包含要在启动时执行的命令的jlss.h
文件的支持。我不相信我想补充一点。
我建议通过电子邮件(请参阅SQLCMD文档或我的SO资料)与我联系,讨论从这里发生的事情 - 请在主题行中包含SQLCMD。
顺便提一下,作为一个短期的解决方法,在RHEL 7上使用SQLCMD 87.00没有什么可以阻止你的。或者,你可能会发现你需要编辑memmem()
删除或更新const
的声明 - 它在87.00代码中,因为我当时并不知道该功能在某些平台上可用 - 它既不是C11也不是POSIX 2017的一部分。
从返回类型中删除{{1}}。当我使用GCC 7.3.0在macOS 10.13.4(High Sierra)上编译87.00时,我得到了一些其他的编译警告,但它们并没有坏处(不管它们是多么不合适)。但是,2010年的代码并不一定能在更现代的系统上进行干净的编译。
(1)该链接可能需要向IIUG注册。这是免费的,并不需要大量的电子邮件 - 通常每周少于一封,我估计 - 除非您选择订阅某些讨论渠道。