Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对于Update语句,JDBC占位符限制的解决方法失败_Java_Sql Server_Jdbc_Prepared Statement - Fatal编程技术网

Java 对于Update语句,JDBC占位符限制的解决方法失败

Java 对于Update语句,JDBC占位符限制的解决方法失败,java,sql-server,jdbc,prepared-statement,Java,Sql Server,Jdbc,Prepared Statement,我正在实现一个模式来绕过JDBC的限制。对于准备好的语句,JDBC将占位符的数量限制为2100。为了解决这个问题,我使用了一个包含2100+个值的xml字符串,并在SQL Server端使用函数tf_splitxml对其进行解析。我这样做是为了使用准备好的语句的~4个Java方法 这个tf_splitxml只构造一个包含所有值的列“token”。因此,xml字符串为: '<node><value>1</value><value>2</valu

我正在实现一个模式来绕过JDBC的限制。对于准备好的语句,JDBC将占位符的数量限制为2100。为了解决这个问题,我使用了一个包含2100+个值的xml字符串,并在SQL Server端使用函数tf_splitxml对其进行解析。我这样做是为了使用准备好的语句的~4个Java方法

这个tf_splitxml只构造一个包含所有值的列“token”。因此,xml字符串为:

'<node><value>1</value><value>2</value></node>' 
它告诉我,将nvarchar值转换为int数据类型时,转换失败[对于上面的xml字符串]。奇怪的是,如果我提取由prepared语句设置的查询,我就可以在SQL Server中完美地运行它

我的想法:

  • 在这4种方法中,有3种使用这种xml模式;这3个都是select语句,使用executeQuery()。第四个失败的方法是update语句,使用executeUpdate()。也许问题与预编译sql语句的方式有关
  • 我尝试过的事情:

  • 我创建了一个表,可以持久化从tf_splitxml生成的标记。对于失败的方法,在JDBC抛出错误之前,永远不会调用tf_splitxml

  • 在Java方面,我使用ps.setString(index,convertToXML(idsArray))。这适用于前3个方法,即使my@xml不是字符串(它声明为xml变量)。我尝试将其切换到SQLXML对象,但没有成功。我仍然可以使用相同的3/4方法正常工作

  • 我可以在SQL Server编辑器中直接运行所有准备好的查询


  • 我最诚挚的谢意(提前!)

    那代码看起来很疯狂,看看我的。下面是一个简单的例子:

    public void delete(final List<Integer> employeeIds) {
      new ChunkWorkTemplate<Integer>(50, employeeIds) {
        protected void executeOnChunk(List<Integer> chunk) {
          Session session = getSession();
          Query query = session.createSQLQuery("delete from Employee where employeeId in (:employeeIds)");
          query.setParameterList("employeeIds", chunk);
          query.executeUpdate();
        }
      }.execute();
    }
    
    public void delete(最终列表employeeid){
    新的ChunkWorkTemplate(50个,员工ID){
    受保护的void executeOnChunk(列表块){
    Session=getSession();
    Query Query=session.createSQLQuery(“从employeeId位于(:employeeId)中的员工中删除”);
    setParameterList(“EmployeeId”,chunk);
    query.executeUpdate();
    }
    }.execute();
    }
    

    请注意,模板的第一个参数是块大小,您可以随意设置。基本上,它会将输入集合分块,并分块执行主体。因此,在上面的示例中,如果您有207个员工ID,区块大小为50,那么您将有5个区块(50+50+50+50+7)。我写这篇文章就是为了解决你面临的问题。希望这有帮助。

    代码看起来很疯狂,请查看我的。下面是一个简单的例子:

    public void delete(final List<Integer> employeeIds) {
      new ChunkWorkTemplate<Integer>(50, employeeIds) {
        protected void executeOnChunk(List<Integer> chunk) {
          Session session = getSession();
          Query query = session.createSQLQuery("delete from Employee where employeeId in (:employeeIds)");
          query.setParameterList("employeeIds", chunk);
          query.executeUpdate();
        }
      }.execute();
    }
    
    public void delete(最终列表employeeid){
    新的ChunkWorkTemplate(50个,员工ID){
    受保护的void executeOnChunk(列表块){
    Session=getSession();
    Query Query=session.createSQLQuery(“从employeeId位于(:employeeId)中的员工中删除”);
    setParameterList(“EmployeeId”,chunk);
    query.executeUpdate();
    }
    }.execute();
    }
    

    请注意,模板的第一个参数是块大小,您可以随意设置。基本上,它会将输入集合分块,并分块执行主体。因此,在上面的示例中,如果您有207个员工ID,区块大小为50,那么您将有5个区块(50+50+50+50+7)。我写这篇文章就是为了解决你面临的问题。希望这能有所帮助。

    jdbc对占位符的数量没有限制;这是您的特定驱动程序或数据库。对不起,我指的是SQLServer。你说得对,马克jdbc对占位符的数量没有限制;这是您的特定驱动程序或数据库。对不起,我指的是SQLServer。你说得对,马克嗨,乔纳森!谢谢你的意见。是的,这适用于我可以使用chunkify的情况。然而,如果我说:select*from tableA INTERNAL join tableBHi JONANSON!谢谢你的意见。这只适用于我可以进行chunkify的情况。如果我在多个联接表上执行select语句,您可能会遇到多个问题:1。批处理,也会执行重复处理。2.返回了错误的数据。(对于NOT IN子句,组块化并不容易。)嗨,乔纳森!谢谢你的意见。是的,这适用于我可以使用chunkify的情况。然而,如果我说:select*from tableA INTERNAL join tableBHi JONANSON!谢谢你的意见。这只适用于我可以进行chunkify的情况。如果我在多个联接表上执行select语句,您可能会遇到多个问题:1。批处理,也会执行重复处理。2.返回了错误的数据。(对于NOT IN子句,组块化并不容易。)