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 无法在SQL Server中通过JDBC调用创建架构_Java_Sql Server_Jdbc - Fatal编程技术网

Java 无法在SQL Server中通过JDBC调用创建架构

Java 无法在SQL Server中通过JDBC调用创建架构,java,sql-server,jdbc,Java,Sql Server,Jdbc,我使用的是官方SQL Server JDBC驱动程序: com.microsoft.sqlserver mssql jdbc 6.2.0.jre8 要在此处运行此代码,请执行以下操作: try(连接c=new com.microsoft.sqlserver.jdbc.SQLServerDriver().connect(u,p)){ try(PreparedStatement s1=c.prepareStatement(“创建模式x”); PreparedStatement s2=c.prep

我使用的是官方SQL Server JDBC驱动程序:


com.microsoft.sqlserver
mssql jdbc
6.2.0.jre8
要在此处运行此代码,请执行以下操作:

try(连接c=new com.microsoft.sqlserver.jdbc.SQLServerDriver().connect(u,p)){
try(PreparedStatement s1=c.prepareStatement(“创建模式x”);
PreparedStatement s2=c.prepareStatement(“删除模式x”)){
System.out.println(s1.execute());
System.out.println(s2.execute());
}
}
但我得到了一个错误:

com.microsoft.sqlserver.jdbc.SQLServerException:关键字“schema”附近的语法不正确。
位于com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:258)
位于com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1547)
位于com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:528)
位于com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:461)
位于com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7151)
位于com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2689)
位于com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:224)
位于com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:204)
位于com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:445)
显然,这些语句是正确的,它们作为静态语句工作:

try (Statement s1 = c.createStatement();
     Statement s2 = c.createStatement()) {
    System.out.println(s1.execute("create schema x"));
    System.out.println(s2.execute("drop schema x"));
}

这是故意的,还是JDBC驱动程序中的错误?

这似乎是版本6.2.0中的回归。它曾经在6.1.0版本中工作。我已向Microsoft报告了此问题:

CREATE VIEW
语句也会受到影响:

//适用于6.2.0和6.1.0两个版本
try(语句s1=c.createStatement();
语句s2=c.createStatement()){
System.out.println(s1.execute(“创建视图x作为选择1A”);
System.out.println(s2.execute(“下拉视图x”);
}
//仅适用于版本6.1.0
try(PreparedStatement s1=c.prepareStatement(“创建视图x作为选择1 a”);
PreparedStatement s2=c.prepareStatement(“下拉视图x”)){
System.out.println(s1.execute());
System.out.println(s2.execute());
}

(我在Stack Overflow上记录这一点,因为运行DDL的几个工具,包括jOOQ、Hibernate、MyBatis、Flyway等,可能会受到影响)

不是我的DV,似乎是一个合理的QA。我很好奇为什么它会失败,你能分析一下SQL并准确地看到发送到SQL Server的是什么吗?@DavidG:对SQL Server工具不太熟悉。我在日志目录的跟踪文件中没有看到任何消息。通过JDBC驱动程序进行调试不会显示语句字符串本身有任何异常。当然,我对发送到服务器的协议字节知之甚少……在SQLServerManagementStudio、工具菜单、SQLServerProfiler中。它可以让您看到正在发送哪些SQL命令。在这种情况下,如果驱动程序挡住了路,则可能不会显示任何内容,但异常消息似乎表明它来自SQL引擎。当然,我不认为为创建模式和视图而准备的语句有多大好处:)@DavidG:哦,非常有趣,谢谢。我通过跟踪文件启动了分析器,难怪我没有看到任何有趣的东西。嗯,准备好的语句版本发送这个字符串(在6.2.0中):
exec sp\u executesql N'drop schema x',NULL
。有趣的拖尾
NULL
参数。在此之前(在6.1.0中),有一个更为复杂的批处理调用
[…]exec sp_prepexec@p1 output,NULL,N'create schema x'[…]
,这显然看起来像是6.2.0中性能调整的副作用,它是由。