gpt4 book ai didi

java - 用于从数据库检索值的批处理语句执行的最佳替代方案是什么(MSSQL 2008)

转载 作者:行者123 更新时间:2023-12-02 08:04:47 25 4
gpt4 key购买 nike

我有一个 SQL 查询,如下所示。

SELECT O_DEF,O_DATE,O_MOD from OBL_DEFINITVE WHERE OBL_DEFINITVE_ID =?

Id 集合将传递给此查询并作为批量查询运行。执行次数为 10000从数据库检索值的时间。(其他一些困惑)

public static Map getOBLDefinitionsAsMap(Collection oblIDs)
throws java.sql.SQLException
{
Map retVal = new HashMap();
if (oblIDs != null && (!oblIDs.isEmpty()))
{
BatchStatementObject stmt = new BatchStatementObject();
stmt.setSql(SELECT O_DEF,O_DATE,O_MOD from OBL_DEFINITVE WHERE OBL_DEFINITVE_ID=?);
stmt.setParameters(
PWMUtils.convertCollectionToSubLists(taskIDs, 1));
stmt.setResultsAsArray(true);
QueryResults rows = stmt.executeBatchSelect();
int rowSize = rows.size();
for (int i = 0; i < rowSize; i++)
{
QueryResults.Row aRow = (QueryResults.Row) rows.getRow(i);
CoblDefinition ctd = new CoblDefinition(aRow);


retVal.put(aRow.getLong(0), ctd);
}
}

return retVal;

现在我们已经确定,如果查询修改为添加为

SELECT O_DEF,O_DATE,O_MOD from OBL_DEFINITVE WHERE OBL_DEFINITVE_ID in (???)

这样我们就可以将其减少到 1 个查询。

这里的问题是 MSSQL 服务器抛出异常

 Prepared or callable statement has more than 2000 parameter

并在这里被击中。有人可以提供更好的替代方案

最佳答案

允许的参数有最大数量,我们称之为 n。您可以执行以下操作之一:

  • 如果有 m*n + k 参数,则可以创建 m 个批处理(如果 k 不为 0,则可以创建 m+1 个批处理)。如果您有 10000 个参数,并且允许的最大参数为 2000 个,则只需要 5 个批处理。

  • 另一个解决方案是在应用程序中生成查询字符串并将参数添加为字符串。这样您只需运行一次查询。这对于速度来说是一个明显的优化,但是您将在应用程序中生成一个查询字符串。您可以像这样设置 where 子句:

String myWhereClause = "其中 TaskID = "+ taskIDs[0];

for (int i = 1; i < numberOfTaskIDs; i++)

{

myWhereClause += " or TaskID = " + taskIDs[i];

}

关于java - 用于从数据库检索值的批处理语句执行的最佳替代方案是什么(MSSQL 2008),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8356348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com