Как применить продолжение строки, если строка слишком длинная? - PullRequest
0 голосов
/ 09 июля 2020

У меня длинный запрос MySQL в VBA.

Я попытался поставить пробел и '_'. Что мне не хватает?

Sql = "insert IGNORE into nhc (date,dealer_code,name,area_executive,address1,address2,address3,area_territory_id,area_territory_name,micro_market_id,micro_market_name,town,postcode,state,area_name,distributor,remark,may_2020_ga,may_2020_awtu10,may_2020_sellin,may_2020_awmi10,jun_2020_ga,jun_2020_awtu10, _
jun_2020_sellin,jun_2020_awmi10,jul_2020_ga,jul_2020_awtu10,jul_2020_sellin,jul_2020_awmi10,aug_2020_ga,aug_2020_awtu10,aug_2020_sellin,aug_2020_awmi10,dealer_class,may_2020_projected_dealer_class,jun_2020_projected_dealer_class,jul_2020_projected_dealer_class,aug_2020_projected_dealer_class, _
current_clas_awtu_target,current_class_sellin_target,current_class_awmi_target,dealer_status,disc_date,ambitious_dealer?_y/n,shopfront_signage,may_2020_mnp_awtu10,jun_2020_mnp_awtu10,jul_2020_mnp_awtu10,aug_2020_mnp_awtu10,may_2020_ereload_sellin,jun_2020_ereload_sellin,jul_2020_ereload_sellin,aug_2020_ereload_sellin,may_2020_hero_sell_through,jun_2020_hero_sell_through,jul_2020_hero_sell_through,aug_2020_hero_sell_through _
,may_2020_ga_with_ocr,jun_2020_ga_with_ocr,jul_2020_ga_with_ocr,aug_2020_ga_with_ocr)values _
('" & row.Cells(1).Value & "', '" & row.Cells(2).Value & "','" & row.Cells(3).Value & "', '" & row.Cells(4).Value & "', '" & row.Cells(5).Value & "','" & row.Cells(6).Value & "', '" & row.Cells(7).Value & "', '" & row.Cells(8).Value & "','" & row.Cells(9).Value & "', '" & row.Cells(10).Value & "', '" & row.Cells(11).Value & "','" & _
row.Cells(12).Value & "', '" & row.Cells(13).Value & "', '" & row.Cells(14).Value & "','" & row.Cells(15).Value & "', '" & row.Cells(16).Value & "', '" & row.Cells(17).Value & "','" & row.Cells(18).Value & "', '" & row.Cells(19).Value & "', '" & row.Cells(20).Value & "','" & row.Cells(21).Value & "', '" & row.Cells(22).Value & "', '" & row.Cells(23).Value & "','" & row.Cells(24).Value & "', '" & row.Cells(25).Value & "', '" & _
row.Cells(26).Value & "','" & row.Cells(27).Value & "', '" & row.Cells(28).Value & "', '" & row.Cells(29).Value & "','" & row.Cells(30.Value & "', '" & _
row.Cells(31).Value & "', '" & row.Cells(32).Value & "','" & row.Cells(33).Value & "', '" & row.Cells(34).Value & "', '" & row.Cells(35).Value & "','" & row.Cells(36).Value & "', '" & row.Cells(37).Value & "', '" & row.Cells(38).Value & "','" & _
row.Cells(39).Value & "', '" & row.Cells(40).Value & "', '" & row.Cells(41).Value & "','" & row.Cells(42).Value & "', '" & row.Cells(43).Value & "', '" & row.Cells(44).Value & "','" & row.Cells(45).Value & "', '" & row.Cells(46).Value & "', '" & row.Cells(47).Value & "','" & row.Cells(48).Value & "', '" & row.Cells(49).Value & "', '" & row.Cells(50).Value & "','" & row.Cells(51).Value & "', '" & row.Cells(52).Value & "', '" & row.Cells(53).Value & "','" & row.Cells(54).Value & "', '" & row.Cells(55).Value & "', '" & _
row.Cells(56).Value & "','" & row.Cells(57).Value & "', '" & row.Cells(58).Value & "', '" & row.Cells(59).Value & "','" & row.Cells(60).Value & "', '" & row.Cells(61).Value & "')"            

Ответы [ 3 ]

2 голосов
/ 09 июля 2020

В VBA нет строковых литералов. Каждую строку нужно заканчивать закрытием кавычек, амперсандом для объединения следующей строки и подчеркиванием в качестве продолжения строки " & _.

Использование WorksheetFunction.TextJoin() значительно облегчит вашу жизнь.

Sql = "insert IGNORE into nhc (date" & _
    "dealer_code, name, area_executive, address1, address2, address3, " & _
    "area_territory_id, area_territory_name, micro_market_id, micro_market_name, town, postcode, " & _
    "state, area_name, distributor, remark, may_2020_ga, may_2020_awtu10, " & _
    "may_2020_sellin, may_2020_awmi10, jun_2020_ga, jun_2020_awtu10,  jun_2020_sellin, jun_2020_awmi10, " & _
    "jul_2020_ga, jul_2020_awtu10, jul_2020_sellin, jul_2020_awmi10, aug_2020_ga, aug_2020_awtu10, " & _
    "aug_2020_sellin, aug_2020_awmi10, dealer_class ,  may_2020_projected_dealer_class,  jun_2020_projected_dealer_class,  jul_2020_projected_dealer_class, " & _
    "aug_2020_projected_dealer_class,  current_clas_awtu_target, current_class_sellin_target, current_class_awmi_target, dealer_status, disc_date, " & _
    "ambitious_dealer?_y/n, shopfront_signage, may_2020_mnp_awtu10, jun_2020_mnp_awtu10, jul_2020_mnp_awtu10, aug_2020_mnp_awtu10, " & _
    "may_2020_ereload_sellin, jun_2020_ereload_sellin, jul_2020_ereload_sellin, aug_2020_ereload_sellin, may_2020_hero_sell_through, jun_2020_hero_sell_through, " & _
    "jul_2020_hero_sell_through, aug_2020_hero_sell_through, may_2020_ga_with_ocr, jun_2020_ga_with_ocr, jul_2020_ga_with_ocr, aug_2020_ga_with_ocr, " & _
    "Error 2042) VALUES" & _
    "('" & WorksheetFunction.TextJoin("', '", False, Row.Resize(1, 60)) & ")"
    
2 голосов
/ 09 июля 2020

Разбейте его на части:

SQL = "insert IGNORE into nhc"
SQL = SQL & " (date,dealer_code,name,area_executive,"

et c ...

и обратите внимание на пробелы в нужном месте. Мне нравится, чтобы каждая строка начиналась с пробела (как показано выше), поэтому легко определить, не хватает ли он вам.

Максимальный размер строки в VBA

Также подумайте о том, чтобы вместо этого использовать параметры для чего-то вроде этого, чтобы вам не понадобилась строка длиной в миллион миль.

1 голос
/ 09 июля 2020

Я не уверен, есть ли какая-либо документация в поддержку моего ответа, но согласно документации Microsoft для строкового типа данных :

Вы должны заключить String literal в кавычках (" ").

Ваши продолжения не работали, потому что они находились в вашей строке, пока вы не начнете добавлять биты row.Cells(x).Value.

Для продолжения чтобы быть правильным, согласно документации MS для Visual Basi c Как: разбить и объединить операторы :

Используйте символ продолжения строки, который является подчеркиванием (_) в точке, в которой вы хотите, чтобы линия разорвалась. Перед символом подчеркивания должен стоять пробел и сразу за ним следует знак конца строки (возврат каретки) или (начиная с версии 16.0) комментарий, за которым следует возврат каретки.

Примечание: Эта документация предназначена для Visual Basic. Чтобы сделать его релевантным для Visual Basic for Applications, вы должны объединить (&) строку с символом продолжения строки, если вы продолжаете строковый литерал на новой строке; например:

"This string will be continued" & _
" on this line."

Чтобы правильно использовать продолжение строки с предоставленной строкой, оно должно выглядеть следующим образом:

Sql = "insert IGNORE into nhc (date,dealer_code,name,area_executive,address1,address2,address3,area_territory_id,area_territory_name,micro_market_id,micro_market_name,town,postcode,state,area_name,distributor,remark,may_2020_ga,may_2020_awtu10,may_2020_sellin,may_2020_awmi10,jun_2020_ga,jun_2020_awtu10," & _
" jun_2020_sellin,jun_2020_awmi10,jul_2020_ga,jul_2020_awtu10,jul_2020_sellin,jul_2020_awmi10,aug_2020_ga,aug_2020_awtu10,aug_2020_sellin,aug_2020_awmi10,dealer_class,may_2020_projected_dealer_class,jun_2020_projected_dealer_class,jul_2020_projected_dealer_class,aug_2020_projected_dealer_class," & _
" current_clas_awtu_target,current_class_sellin_target,current_class_awmi_target,dealer_status,disc_date,ambitious_dealer?_y/n,shopfront_signage,may_2020_mnp_awtu10,jun_2020_mnp_awtu10,jul_2020_mnp_awtu10,aug_2020_mnp_awtu10,may_2020_ereload_sellin,jun_2020_ereload_sellin,jul_2020_ereload_sellin,aug_2020_ereload_sellin,may_2020_hero_sell_through,jun_2020_hero_sell_through,jul_2020_hero_sell_through,aug_2020_hero_sell_through" & _
" ,may_2020_ga_with_ocr,jun_2020_ga_with_ocr,jul_2020_ga_with_ocr,aug_2020_ga_with_ocr)values" & _
" ('" & row.Cells(1).Value & "', '" & row.Cells(2).Value & "','" & row.Cells(3).Value & "', '" & row.Cells(4).Value & "', '" & row.Cells(5).Value & "','" & row.Cells(6).Value & "', '" & row.Cells(7).Value & "', '" & row.Cells(8).Value & "','" & row.Cells(9).Value & "', '" & row.Cells(10).Value & "', '" & row.Cells(11).Value & "','" & _
row.Cells(12).Value & "', '" & row.Cells(13).Value & "', '" & row.Cells(14).Value & "','" & row.Cells(15).Value & "', '" & row.Cells(16).Value & "', '" & row.Cells(17).Value & "','" & row.Cells(18).Value & "', '" & row.Cells(19).Value & "', '" & row.Cells(20).Value & "','" & row.Cells(21).Value & "', '" & row.Cells(22).Value & "', '" & row.Cells(23).Value & "','" & row.Cells(24).Value & "', '" & row.Cells(25).Value & "', '" & _
row.Cells(26).Value & "','" & row.Cells(27).Value & "', '" & row.Cells(28).Value & "', '" & row.Cells(29).Value & "','" & row.Cells(30.Value & "', '" & _
row.Cells(31).Value & "', '" & row.Cells(32).Value & "','" & row.Cells(33).Value & "', '" & row.Cells(34).Value & "', '" & row.Cells(35).Value & "','" & row.Cells(36).Value & "', '" & row.Cells(37).Value & "', '" & row.Cells(38).Value & "','" & _
row.Cells(39).Value & "', '" & row.Cells(40).Value & "', '" & row.Cells(41).Value & "','" & row.Cells(42).Value & "', '" & row.Cells(43).Value & "', '" & row.Cells(44).Value & "','" & row.Cells(45).Value & "', '" & row.Cells(46).Value & "', '" & row.Cells(47).Value & "','" & row.Cells(48).Value & "', '" & row.Cells(49).Value & "', '" & row.Cells(50).Value & "','" & row.Cells(51).Value & "', '" & row.Cells(52).Value & "', '" & row.Cells(53).Value & "','" & row.Cells(54).Value & "', '" & row.Cells(55).Value & "', '" & _
row.Cells(56).Value & "','" & row.Cells(57).Value & "', '" & row.Cells(58).Value & "', '" & row.Cells(59).Value & "','" & row.Cells(60).Value & "', '" & row.Cells(61).Value & "')"
        

Вы заметите, что теперь каждая строка заключена в кавычки , затем пробел и подчеркивание. При форматировании на SO символ подчеркивания теперь белого цвета, показывая, что он больше не является частью строкового литерала (красный), поскольку он больше не заключен в кавычки.

С учетом всего Я согласен с ответом Brax о том, что было бы «лучше» разбить вашу строку на более мелкие части и объединить более мелкие части вместе, а также использовать параметры для уменьшения размера строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...