Java 在sql server上使用jdbc PreparedStatement获取查询计划
使用statent,resultSet.getObject以xml形式返回查询计划Java 在sql server上使用jdbc PreparedStatement获取查询计划,java,sql-server,jdbc,prepared-statement,Java,Sql Server,Jdbc,Prepared Statement,使用statent,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 {
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\u XML作为一个PreparedStatement将不起作用;但是,当您直接运行此语句并将实际查询作为准备好的语句运行时,应该会得到所需的结果。代码:
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);
}
希望对您有所帮助。我还没有找到任何参考资料说明为什么在
上执行SET SHOWPLAN\u XML作为准备好的语句将不起作用;但是,当您直接运行此语句并将实际查询作为准备好的语句运行时,应该会得到所需的结果。代码:
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);
}
希望能有帮助。我很早就试过了,没用。ps.getResultSet()的结果集为空
@vels4j:您使用的是哪个SQL Server版本和JDBC驱动程序?我试着在家使用SQL Server 2012、jTDS 1.3.1和一个与您不同的表;然而,我没想到这些差异会有多大影响。我的示例中的ps.getResultSet()
不是null
,然后通过mavenI使用sqljdbc4-4.0.2206.100.jar尝试了这个早期工具,但没有成功。ps.getResultSet()的结果集为空
@vels4j:您使用的是哪个SQL Server版本和JDBC驱动程序?我试着在家使用SQL Server 2012、jTDS 1.3.1和一个与您不同的表;然而,我没想到这些差异会有多大影响。我的示例中的ps.getResultSet()
不是null
,然后通过maven使用sqljdbc4-4.0.2206.100.jar