以 '....' 开头的标识符太长。最大长度为 128



我尝试从MSSQL数据库中检索元数据,但我得到了以下错误:

com.microsoft.sqlserver.jdbc.SQLServerException: The identifier that starts with 'LOCALHOST:1433;CONNECTRETRYINTERVAL=10;CONNECTRETRYCOUNT=1;MAXRESULTBUFFER=-1;SENDTEMPORALDATATYPESASSTRINGFORBULKCOPY=TRUE;DELA' is too long. Maximum length is 128.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:265)
at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:299)
at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:132)
at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:37)
at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:26)
at com.microsoft.sqlserver.jdbc.SQLServerConnection$1ConnectionCommand.doExecute(SQLServerConnection.java:3897)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7730)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:3786)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectionCommand(SQLServerConnection.java:3905)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.setCatalog(SQLServerConnection.java:4271)
at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.switchCatalogs(SQLServerDatabaseMetaData.java:400)
at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.getResultSetFromStoredProc(SQLServerDatabaseMetaData.java:349)
at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.getResultSetWithProvidedColumnNames(SQLServerDatabaseMetaData.java:374)
at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.getTables(SQLServerDatabaseMetaData.java:561)
at com.zaxxer.hikari.pool.ProxyDatabaseMetaData.getTables(ProxyDatabaseMetaData.java:68)
at com.zaxxer.hikari.pool.HikariProxyDatabaseMetaData.getTables(HikariProxyDatabaseMetaData.java)
at com.scand.bma.querytool.service.MetaDataService.getTablesInfo(MetaDataService.java:52)

这是我的连接设置:

spring.datasource.url=jdbc:sqlserver://localhost:1433;DatabaseName=test_mssql;encrypt=true;trustServerCertificate=true;
spring.datasource.username=test
spring.datasource.password=dNZrpWp:0tEEv"JSWGE*
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.jpa.show-sql=true
spring.jpa.hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.hibernate.ddl-auto=create-drop

这是我收到错误时的代码:

try (final Connection connection = jdbcTemplate.getDataSource().getConnection()) {
final Map<String, List<Map<String, Object>>> tablesAndColumns = new LinkedHashMap<>();
final DatabaseMetaData metaData = connection.getMetaData();
final String databaseName = StringUtils.substringAfterLast(connection.getMetaData().getURL(), "/");
result.setTableName(databaseName);
try (final ResultSet tables = metaData.getTables(databaseName.toUpperCase(), null, null, new String[]{"TABLE"})) {
...
}
}

我在这个地方得到错误:

metaData.getTables(databaseName.toUpperCase(), null, null, new String[]{"TABLE"})

我添加了这个依赖项:

implementation group: 'com.microsoft.sqlserver', name: 'mssql-jdbc', version: '11.2.0.jre17'

SQL查询执行得很好,但我无法获取元数据。

我的问题就在这个地方:

final String databaseName = StringUtils.substringAfterLast(connection.getMetaData().getURL(), "/");

我等着看test_mssql,但我会得到这个:LOCALHOST:1433;CONNECTRETRYINTERVAL=10;CONNECTRETRYCOUNT=1;MAXRESULTBUFFER=-1;SENDTEMPORALDATATYPESASSTRINGFORBULKCOPY=TRUE;DELA

感谢M.Deinum的评论。

最新更新