我想将行插入到有 118 列的表中。 我的经验是,它与 mssql-jdbc-8.2.2.jre8.jar 完美配合,但不幸的是,对于任何后续问题(我测试了从 9.2.1 到 12.8.1 的所有问题)都会返回 java.sql.BatchUpdateException,并注明118.位置的列长度无效。 118. 仅当列为 VARCHAR 或 NVARCHAR 时才会发生这种情况。 FLOAT 或其他数字类型时不会出错。因此,如果有人已经遇到过这个问题,或者知道任何解决方案,请告诉我。这是我的PreparedStatement的命令:
insert into tt
(CUSTOMER_ID,Value_date,_default,J_termek1,J_termek2,J_termek1_appl_pont,J_termek1_beh_pont,J_termek2_appl_pont,J_termek2_beh_pont,J_t
ermek1_appl_intercept,J_termek1_appl_beta,J_termek1_beh_intercept,J_termek1_beh_beta,J_t
ermek1_appl_weight,J_termek1_beh_weight,J_REL_def_STD,J_macro_correction,J_termek2_appl_intercept,J_termek2_appl_beta,J_termek2_beh_in
tercept,J_termek2_beh_beta,J_termek2_appl_weight,J_termek2_beh_weight,J_termek1_weight,J_termek2_weight,L_termek1,L_
termek2,L_termek1_appl_pont,L_termek1_beh_pont,L_termek2_appl_pont,L_termek2_beh_pont,L_termek1_appl_intercept,L_termek1_appl_beta,L_t
ermek1_beh_intercept,L_termek1_beh_beta,L_termek1_appl_weight,L_termek1_beh_weight,L_REL_def_STD,L_macro_correction,
L_termek2_appl_intercept,L_termek2_appl_beta,L_termek2_beh_intercept,L_termek2_beh_beta,L_termek2_appl_weight,L_termek2_beh_weight,L_t
ermek1_weight,L_termek2_weight,S_termek1,S_termek2,S_termek1_appl_pont,S_termek1_beh_pont,S_termek2_appl_pont,S_term
ek2_beh_pont,S_termek1_appl_intercept,S_termek1_appl_beta,S_termek1_beh_intercept,S_termek1_beh_beta,S_termek1_appl_weight,S_termek1_b
eh_weight,S_REL_def_STD,S_macro_correction,S_termek2_appl_intercept,S_termek2_appl_beta,S_termek2_beh_intercept,S_te
rmek2_beh_beta,S_termek2_appl_weight,S_termek2_beh_weight,S_termek1_weight,S_termek2_weight,O_termek1,O_termek2,O_termek1_appl_pont,O_
termek1_beh_pont,O_termek2_appl_pont,O_termek2_beh_pont,O_termek1_appl_intercept,O_termek1_appl_beta,O_termek1_beh_i
ntercept,O_termek1_beh_beta,O_termek1_appl_weight,O_termek1_beh_weight,O_REL_def_STD,O_macro_correction,O_termek2_appl_intercept,O_ter
mek2_appl_beta,O_termek2_beh_intercept,O_termek2_beh_beta,O_termek2_appl_weight,O_termek2_beh_weight,O_termek1_weigh
t,O_termek2_weight,H_termek1,H_termek2,H_termek1_appl_pont,H_termek1_beh_pont,H_termek2_appl_pont,H_termek2_beh_pont,H_termek1_appl_in
tercept,H_termek1_appl_beta,H_termek1_beh_intercept,H_termek1_beh_beta,H_termek1_appl_weight,H_termek1_beh_weight,H_
REL_def_STD,H_macro_correction,H_termek2_appl_intercept,H_termek2_appl_beta,H_termek2_beh_intercept,H_termek2_beh_beta,H_termek2_appl_
weight,H_termek2_beh_weight,H_termek1_weight,H_termek2_weight,H_atlag_pd,spare3,BEH_PD,behpd,txt1) VALUES
(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
我尝试使用 NVARCHAR 而不是 VARCHAR 但没有成功。我还尝试在插入中添加一个 VARCHAR 列(我之前使用该附加列创建了一个新表),在这种情况下,错误消息表明错误发生在 119. 列(新列)。追踪:
java.sql.BatchUpdateException: A rendszer érvénytelen oszlophosszt kapott a BCP-ügyféltől a következő oszlopazonosítóhoz: 118. at
com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeBatch(SQLServerPreparedStatement.java:2042) 位于
SAS2SQL.writeToOutput(SAS2SQL.java:1098) 位于
SAS2SQL.main(SAS2SQL.java:121)
安排插入的代码部分:
String str = stdin.readLine();
while (str != null) {
counter++;
//log(str);
split(str);
//log(arrayToText(elemek));
int k;
for (int j = 0; j < fields.length; j++) {
tip=fieldtypes[j];
textelem=elemek[j];
k=j+1;
if (textelem==null)pstmt.setString(k,null);
else {
if (tip==Types.VARCHAR || tip==Types.NVARCHAR ) {
pstmt.setString(k, textelem);
//if (insertedRows<15) log("TXT: "+textelem);
}
if (tip==Types.INTEGER ||
tip==Types.BIGINT ||
tip==Types.SMALLINT ||
tip==Types.TINYINT
){
//log2("INT:"+Float.parseFloat());
if (textelem.trim().equals(".")) pstmt.setNull(k, java.sql.Types.FLOAT);
else pstmt.setFloat(k, Float.parseFloat(textelem));
}
if (tip==Types.FLOAT ||
tip==Types.NUMERIC ||
tip==Types.DOUBLE ||
tip==Types.DECIMAL ) {
if (textelem.trim().equals(".")) pstmt.setNull(k, java.sql.Types.DOUBLE);
else pstmt.setDouble(k, Double.parseDouble(textelem));
}
if (tip==Types.DATE) {
if (textelem.trim().equals(".")) pstmt.setNull(k, java.sql.Types.DATE);
else pstmt.setDate(k, java.sql.Date.valueOf(textelem));
//log2("DATE:"+SASResultSet.getDate(j).toString());
}
if (tip==Types.TIMESTAMP) {
if (textelem.trim().equals(".")) pstmt.setNull(k, java.sql.Types.TIMESTAMP);
else pstmt.setTimestamp(k,Timestamp.valueOf(textelem.trim()));
}
if (tip==Types.TIME) {
if (textelem.trim().equals(".")) pstmt.setNull(k, java.sql.Types.TIME);
else pstmt.setTime(k,Time.valueOf(textelem.trim()));
//log2("TIME:"+SASResultSet.getTime(j).toString());
}
}
}
str = stdin.readLine();
insertedRows++;
pstmt.addBatch();
bulkcounter++;
if (bulkcounter==batchSize){
pstmt.executeBatch();
pstmt.clearBatch();
bulkcounter=0;
if (monitor)log(getTime()+" / "+insertedRows);
}
//pstmt.executeUpdate();
}
if (bulkcounter!=0) {
pstmt.executeBatch();
pstmt.clearBatch();
if (monitor)log(getTime()+" / "+insertedRows);
}
//if (siker==0) log(""+counter+". sor beszúrása sikertelen");
sqlServerConnection.commit();
//outputConnection.commit();
stdin.close();
pstmt.close();
log("Number of inserted rows: "+insertedRows);
所以问题是批量复制客户端的限制比原始引擎更窄。 setUseBulkCopyForBatchInsert=false 解决了问题。