2016-11-14 4 views
-1

XMLから生成された大きなSQLスクリプトファイルがあります。一部の値の行を挿入すると、誤った数の値が渡され、エラーColumn count doesn't match value countが発生します。考えられる構文エラーを追跡したいと思います。 SQLスクリプトファイルには300k行が含まれているので、そのスクリプトを記述したいと思います。SQLスクリプトのカッコ内の引数/パラメータの数を修正しました

のようなステートメント内の値の番号を確認する方法はあります:

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

すべてのヘルプは大歓迎です。

+0

SQL文字列値を一重引用符で囲む必要はありませんか? –

+0

また、生成されたファイルには '\ r \ n'という行末がありますか? –

+0

私は別の質問をしましたが、似たような性質のものがあまりにもずっと前です。見てみると、これから一緒に何かを作ることができるかどうか試してみてください。http://stackoverflow.com/questions/38807810/bash-cut-and-paste-sql -insert-statement @glennjackmanええと、文字列の値は、SQLの一重引用符で囲む必要があります。 – dood

答えて

0

SQLは解析が非常に困難です。あなたのデータがかなりシンプルで、あなたのSQLがかなり規則的であれば、希望通りの方法でawkを使うことができます。個人的には、データベースに挿入された値を調べ、それらのスクリプトをスキャンするか、またはその逆の可能性があります。または、一連のprint文を挿入し、エラーメッセージがどこに挿入されているかを確認します。 awkでの最善の結果を期待

、のは、それに古い大学の試みを与えてみましょう:tr

$ 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'); 

は、我々は改行を削除します。 sedでは、各SQL文(末尾に;で終わる)を1行に配置します。 awkでは、括弧を区切り文字として各行を分割して、列が$2で、値が$4になるようにしました。 splitコマンドは、それぞれにいくつのフィールドがあるかを返します。いずれの場合もカンマを区切り文字として使用します。一致しない場合は、行を出力します。表示される最後の行は、列名twoが存在しないため出力です。

これは、あなたのケースでは恐ろしいものではないかもしれない、いくつかの偽陽性を返す可能性があります。データにセミコロンまたはカンマがある場合、分割は間違っています。 INSERTに列名が記載されていない場合は間違っています。挿入されていない文がある場合は、それらをフィルタリングしたり、別の方法で処理したりする必要があります。

+0

ありがとう!これは本当に助けになりました。私は両方のあなたの提案を使用しました。 INSERT文を分割する必要があったのは、そのうちのいくつかが〜3000行のサイズだったからです。 – leandermelms

関連する問題