在sql server上使用jdbc PreparedStatement获取查询计划

使用Statment,resultSet.getObject将查询计划作为xml返回

Connection conn = getConnection(); String query = " SET SHOWPLAN_XML on "; Statement st = conn.createStatement(); boolean execute=st.execute(query); log.info("execute status {} " , execute); query = " SELECT ATMPROFILES.TERMID as COLUMNID, ATMPROFILES.TERMID as COLUMNNAME FROM ATMPROFILES (NOLOCK) " + " WHERE Authprocessname = 'ATMST' " + "ORDER BY ATMPROFILES.TERMID "; ResultSet rs = st.executeQuery(query); while(rs.next()) { Object object = rs.getObject(1); log.info("Query Plan {} ", object); } 

但是如果我通过PreparedStatement执行相同的操作,它将返回实际结果而不是QueryPlan

  Connection conn = getConnection(); String query = " SET SHOWPLAN_XML on "; PreparedStatement ps = conn.prepareStatement(query); boolean execute = ps.execute(); log.info("execute status {} " , execute); query = " SELECT ATMPROFILES.TERMID as COLUMNID, ATMPROFILES.TERMID as COLUMNNAME FROM ATMPROFILES (NOLOCK) " + " WHERE Authprocessname = 'ATMST' " + "ORDER BY ATMPROFILES.TERMID "; ps=conn.prepareStatement(query); execute=ps.execute(); log.info("execute status {} " , execute); ResultSet rs = ps.getResultSet(); while(rs.next()) { Object object = rs.getObject(1); // here it returns selected object log.info("Query Plan {} ", object); } 

有任何想法通过PreparedStatement实现这一点。

我没有找到任何参考为什么执行SET SHOWPLAN_XML ON作为SET SHOWPLAN_XML ON准备语句将无法工作; 但是,当您直接运行此语句并将实际查询作为预准备语句时,您应该获得所需的结果。 在代码中:

 Connection conn = getConnection(); String showplanQuery = "SET SHOWPLAN_XML ON"; Statement st = conn.createStatement(); st.execute(showplanQuery); String actualQuery = "SELECT ATMPROFILES.TERMID FROM ATMPROFILES (NOLOCK) "; PreparedStatement ps=conn.prepareStatement(actualQuery); ps.execute(); ResultSet rs = ps.getResultSet(); while(rs.next()) { Object object = rs.getObject(1); // should log the query plan log.info("Query Plan {} ", object); } 

希望有所帮助。