【问题标题】:Sybase DataContext : The column prefix does not match with a table name or alias nameSybase DataContext:列前缀与表名或别名不匹配
【发布时间】:2016-01-28 07:18:09
【问题描述】:

我们正在处理核心 java 代码中的 sybase 数据库。我们使用org.eobjects.metamodel.DataContext 来解析查询。

String sCol[]=table.getColumnNames();
Query query=dataContext.query().from(table.getName()).select(sCol).toQuery();
return new QueryIterator(dataContext.executeQuery(query).iterator());

但它执行查询。相同的代码可以在 Oracle 数据库中正常工作以解析和执行查询。

生成的一些查询示例是:

  • 从 ownername.City 中选择 City.CityName
  • 从城市中选择 City.CityName
  • 从 ownername.City 中选择 CityName
  • 从城市中选择 CityName
  • 从 ownername.City 中选择 ownername.City.CityName
  • 从所有者名称中选择“城市”。“城市名称”。“城市”
  • 从 ownername.City 中选择 *

以上查询均未执行。 我们遇到了这些错误

  • 无法解析 FROM 令牌:“ownername”.“City”
  • 无法执行查询:列前缀“City”与查询中使用的表名或别名不匹配。该表未在 FROM 子句中指定,或者它具有必须使用的相关名称。
  • 无法解析 SELECT 令牌:ownername.City.CityName

我们如何使用元模型和 SYBASE 数据库执行查询,或者有没有其他方法可以执行 sybase 查询?

【问题讨论】:

    标签: java datacontext sap-ase apache-metamodel


    【解决方案1】:

    Oracle(和 Microsoft)使用 Sybase ASE 不使用的模式逻辑结构。在 SAP/Sybase ASE 中,数据库中的所有表和列都在同一个模式中。不过,用户可以在数据库中拥有自己的对象,因此可以使用用户所有权来模仿某些模式行为,但这需要额外的努力。

    对于 Sybase,正确的查询语法是:

    SELECT [ Col1, Col2 | * ]
      FROM [dbName].[ownerName.]TABLE
    

    你的情况

    SELECT CityName
     FROM dbName.ownername.City
    

    在 Sybase ASE 中,通常最佳做法是让所有对象都归“dbo”所有,因此在这种情况下,您可以在查询中省略所有者:

    SELECT CityName
     FROM dbName..City
    

    完整的查询语法和信息可以在Query Section of the Transact SQL Users Guide in the documentation.中找到

    【讨论】:

      【解决方案2】:

      您收到的错误消息来自 MetaModel 的查询解析器层。它甚至在触发查询之前就在数据库的元数据中搜索匹配的列名和表名。

      我注意到您正在使用命名空间“org.eobjects.metamodel”。如果可能的话,您应该升级到 Apache MetaModel(“org.apache.metamodel”),因为自从 MetaModel 引入 Apache 以来,它已经有了很多改进。包括大量查询解析器改进。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-03
        • 1970-01-01
        • 1970-01-01
        • 2020-12-14
        • 2014-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多