修复SQL脚本括号内的参数/参数数量

时间:2016-11-14 18:42:32

标签: sql bash shell sed terminal

我有一个从XML生成的大型SQL脚本文件。在某些值插入行中,传递的值的数量不正确,从而导致错误Column count doesn't match value count。我想跟踪可能的语法错误。由于SQL脚本文件包含300k行,我想为此编写一个脚本。

有没有办法检查语句中的值的数量,如:

INSERT INTO table (
 one,
 two,
 three
)
VALUES (123, 'lorem', 'ipsum');

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

SQL很难解析。如果您的数据非常简单并且您的SQL非常规则,您可能会以您希望的方式使用awk,请参阅下一页。就个人而言,我可能会检查数据库中的插入值,并扫描脚本,反之亦然。或者插入一堆print语句并查看错​​误消息的插入位置。

希望获得最好的awk,让我们给它一个旧的大学尝试:

$ cat dat
INSERT INTO table (
 one,
 two,
 three
)
VALUES (123, 'lorem', 'ipsum');
INSERT INTO table (
 one,
 three
)
VALUES (123, 'lorem', 'ipsum');

$ tr -d \\n < dat | sed 's/;/&\
/g' | awk -F '[()]' 'split($2, cols, /, /) != split($4, vals, /, /) {print}'
INSERT INTO table ( one, three)VALUES (123, 'lorem', 'ipsum');

使用tr,我们会删除换行符。使用sed,我们将每个SQL语句(以;结尾)放在一行上。对于awk,我们使用括号作为分隔符拆分每一行,以便列位于$2中,且值位于$4中。 split命令返回每个字段有多少字段,在两种情况下都使用逗号作为分隔符。如果它们不匹配,请打印该行。显示的最后一行是输出,因为缺少列名two

这可能会带来一些误报,在你的情况下可能并不可怕。如果数据有分号或逗号,则拆分将是错误的。如果INSERT没有提到列名,那就错了。如果存在非插入语句,则必须将其过滤掉,或以不同方式处理它们。