微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 无法在SQL Server中通过JDBC调用CREATE SCHEMA

我正在使用官方的sql Server JDBC驱动程序:

<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>6.2.0.jre8</version>
</dependency>

要在此处运行此代码

try (Connection c = new com.microsoft.sqlserver.jdbc.sqlServerDriver().connect(u, p)) {
    try (PreparedStatement s1 = c.prepareStatement("create schema x");
         PreparedStatement s2 = c.prepareStatement("drop schema x")) {
        System.out.println(s1.execute());
        System.out.println(s2.execute());
    }
}

但是我收到了这个错误

com.microsoft.sqlserver.jdbc.sqlServerException: Incorrect Syntax near the keyword 'schema'.
    at com.microsoft.sqlserver.jdbc.sqlServerException.makeFromDatabaseError(sqlServerException.java:258)
    at com.microsoft.sqlserver.jdbc.sqlServerStatement.getNextResult(sqlServerStatement.java:1547)
    at com.microsoft.sqlserver.jdbc.sqlServerPreparedStatement.doExecutePreparedStatement(sqlServerPreparedStatement.java:528)
    at com.microsoft.sqlserver.jdbc.sqlServerPreparedStatement$PrepStmtExecCmd.doExecute(sqlServerPreparedStatement.java:461)
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7151)
    at com.microsoft.sqlserver.jdbc.sqlServerConnection.executeCommand(sqlServerConnection.java:2689)
    at com.microsoft.sqlserver.jdbc.sqlServerStatement.executeCommand(sqlServerStatement.java:224)
    at com.microsoft.sqlserver.jdbc.sqlServerStatement.executeStatement(sqlServerStatement.java:204)
    at 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报告此问题:https://github.com/Microsoft/mssql-jdbc/issues/370

CREATE VIEW语句也受到影响:

// Works on both versions 6.2.0 and 6.1.0
try (Statement s1 = c.createStatement();
     Statement s2 = c.createStatement()) {
    System.out.println(s1.execute("create view x as select 1 a"));
    System.out.println(s2.execute("drop view x"));
}

// Works only on version 6.1.0
try (PreparedStatement s1 = c.prepareStatement("create view x as select 1 a");
     PreparedStatement s2 = c.prepareStatement("drop view x")) {
    System.out.println(s1.execute());
    System.out.println(s2.execute());
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐