如何通过Bash将多行SQL文件转为单行传入isql避免报错
ODBC连接isql多行SQL输入问题Bash层解决方案
问题核心
isql存在已知缺陷,读取含换行符的输入文件时会触发段错误,仅支持单行格式的SQL查询输入。直接通过反引号嵌套cat读取SQL文件的写法会触发Shell对内容的特殊字符解析,导致SQL内的*被展开为当前目录文件名、反引号被识别为命令替换标记,最终传入的SQL内容错乱。
可用方案
所有方案均通过文本流转换实现,不会触发Shell对SQL内容的解析,无特殊字符错乱问题:
方案1:用tr替换换行为空格(最简洁)
直接将SQL文件内的所有换行符替换为单个空格,拼接为单行后通过管道传入isql,不会出现SQL关键字粘连问题:tr '\n' ' ' < query.sql | isql -v -b BigQuery > data.txt如果是Windows下编辑的带
\r\n换行符的SQL文件,可以先过滤回车符再替换:tr -d '\r' < query.sql | tr '\n' ' ' | isql -v -b BigQuery > data.txt方案2:用awk拼接(自动处理多余空行)
如果SQL文件存在大量空行、缩进排版,用awk逐行拼接可以避免连续多余空格,输出格式更规整:awk 'NF{printf "%s ", $0}' query.sql | isql -v -b BigQuery > data.txt其中
NF判断会自动跳过无内容的空行,仅拼接有效SQL行。
避坑说明
不要使用echo cat query.sql``这类写法:
这类写法会先将SQL内容作为Shell命令的一部分进行解析,SQL中的*、?会被识别为文件通配符,反引号包裹的内容会被识别为待执行的Shell命令,最终会把当前目录文件名、命令执行结果混进SQL内容,完全不符合预期。
内容的提问来源于stack exchange,提问作者Doug Fir
相关产品推荐
相关产品推荐

