2016-11-14 69 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 yup,字符串值應該被SQL中的單引號包圍。 – dood

回答

0

SQL很難解析。如果你的數據非常簡單,而且你的SQL很規則,那麼你可以按照你希望的方式使用awk,看下面的內容。就我個人而言,我可能會檢查數據庫中插入的值,併爲它們掃描腳本,反之亦然。或者插入一堆打印語句並查看錯​​誤消息的插入位置。

盼望在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,值在$4split命令返回它們每個有多少個字段,在這兩種情況下都使用逗號作爲分隔符。如果它們不匹配,則打印該行。顯示的最後一行是輸出,因爲列名稱two缺失。

這可能會返回一些誤報,在您的情況下可能並不可怕。如果數據有分號或逗號,分割將會出錯。如果INSERT沒有提及列名稱,那將是錯誤的。如果有非插入語句,則必須將其過濾出來,或以不同的方式處理它們。

+0

非常感謝!這真的有幫助。我使用了你的兩個建議。我不得不拆分INSERT語句,因爲其中一些語句的大小約爲3000行。 – leandermelms