informix - 对于 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。
解决方案
我只是有点偏见——我写了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 注册。这是免费的,不需要大量的电子邮件——我估计通常每周不到一封——除非你选择订阅一些讨论频道。
推荐阅读
- javascript - 已弃用的 domLoading 已删除!改用什么?
- c# - 如何将自定义控件属性创建为表单,并且该属性具有项目中所有表单的选项?
- c++ - 尝试调用模板类的模板方法时出现编译器错误
- python - 需要用熊猫系列和numpy数组创建一个情节
- sql - 仅当 SQL 中存在记录时加入才有效
- entity-framework - 如何修复“无法更新项目的依赖信息”。请恢复项目并重试'
- c# - 加入项目列表
- php - 尝试在托管在 aws 上的 laravel 应用程序上提交注册表时,我不断收到服务器错误 500
- c++ - 我的代码检查问题 CIELAB 解决方案有什么问题
- ruby-on-rails - 属于项目时无法创建新接口