Code: Alles auswählen.
DATA(lo_sql_statement) = NEW cl_sql_statement( ).
LOOP AT gt_kdauf INTO DATA(ls_kdauf).
lv_sql_statement = |INSERT INTO ASP_KDAUF (SYSID, KDAUF, KDPOS, ETENR, MATNR) VALUES (?, ?, ?, ?, ?)|.
lo_sql_statement->set_param( REF #( gv_sysid ) ).
lo_sql_statement->set_param( REF #( ls_kdauf-kdauf ) ).
lo_sql_statement->set_param( REF #( ls_kdauf-kdpos ) ).
lo_sql_statement->set_param( REF #( ls_kdauf-etenr ) ).
lo_sql_statement->set_param( REF #( ls_kdauf-matnr ) ).
TRY.
lo_sql_statement->execute_update( lv_sql_statement ).
CATCH cx_sql_exception INTO lr_sql_exception.
ENDTRY.
ENDLOOP.
Mit Parametern bei Native SQL zu arbeiten, ist immer empfehlenswert. Ohne Parameter ist das SQL-Statement eine große Sicherheitslücke (SQL-Injection).Also wollte ich mit Parametern arbeiten.
Aktuell wird es bei uns so gemacht, dass über eine interne Tabelle geloopt wird und jede Zeile einzeln weg geschrieben wird. In meinem Code-Beispiel oben habe ich jedes Feld in der wegzuschreibenden Struktur einzeln als Parameter gesetzt.a-dead-trousers hat geschrieben: ↑10.02.2020 11:23Ich bin auch schon auf dieses Problem gestoßen.
Meine Lösung sah so aus, dass ich eine "Blockverarbeitung" drumherum gebaut habe. Das SQL-Statement selbst umfasst zum Beispiel die Variablen für 10 - 20 Datensätze und wird dann halt mehrfach aufgerufen, je nachdem wieviele Datensätze insgesamt übertragen werden sollen. Für den "restlichen Überhang" am Ende gibt es noch ein Einzelsatz-Statement und das wars.
EDIT:
Obwohl, 255 Zeichen klingt für mich jetzt etwas wenig. Mein Problem war eher, dass die gesamt zu übertragende Datenmenge zu groß war und der MSSQL-Server ein Redo-Log von mehreren GB erzeugt hatte. Durch die Blockverarbeitung konnte ich "zwischendrin" immer wieder mal ein COMMT TRANSACTION streuen, damit das Ganze nicht zu sehr ausgeartet ist.