【问题标题】:How can I get "select into" statement to work with H2如何让“select into”语句与 H2 一起使用
【发布时间】:2020-11-14 10:17:50
【问题描述】:

我目前正在为使用 sybase 数据库的现有 java/spring 项目创建回归测试。我被要求为测试构建一个 H2 数据库并在其上运行现有查询以测试结果。

总之,代码调用真实的现有 API,但将 H2 数据库作为 db 源而不是 sybase 传递(通过使用

-DdbServer=tcp:[host]:[port]/./testDatabase

调用托管代码的spring应用程序时)。

我面临的问题是 API 调用的几个现有 sql 查询使用 select COLUMNS into #tempTable,不幸的是 H2 似乎不支持。

我的问题是:我该如何解决这个问题?我可以在 sybase 和 H2 都支持的查询中使用另一个等效命令吗?有没有办法在 H2 数据库周围创建一个包装器,以便它可以捕获“select into”语句并将其更改为 H2 支持的语句?

我在网上查过,但找不到任何东西。我知道 H2 支持 create table NewTable as SELECT 但不幸的是 Sybase 不支持,我特别需要 相同的 SQL 查询 来为两者工作。

我们将不胜感激!

【问题讨论】:

标签: java sql spring h2 sybase


【解决方案1】:

这就是我最终做的:

我从

更改了sql
select columns 
into #tempTable 
from OtherTable 

到:

create #tempTable(columns columnsType)

insert into #tempTable(columns)
  select (columns) from OtherTable

H2 和 Sybase 都支持此功能,似乎不会影响性能。这有点烦人,因为您必须为新表创建所有列,但否则更改非常简单。

这样做的潜在问题是 H2 需要在 create 语句的末尾使用分号,而 Sybase 不需要,所以我通过创建一个自定义 JdbcOperations 类来解决这个问题,该类仅在使用 H2 时调用并添加分号在处理查询之前(我还必须使用它来处理 Sybase 用来创建临时表的井号 (#))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-24
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-15
    • 2012-10-18
    相关资源
    最近更新 更多