【问题标题】:Weird OpenEdge query behaviour奇怪的 OpenEdge 查询行为
【发布时间】:2010-11-26 21:48:25
【问题描述】:

我们最近不得不对第三方产品使用的 OpenEdge 数据库进行一些工作,而今天(经过一番折腾),我们终于确定了为什么视图没有返回任何结果。 这个有问题的视图结合了大约 100 个单独的表,然后被查询(我们对该数据库的权限有限)。此视图返回的字段之一是硬编码的字符串文字,类似于

'John Smith' AS TheName

我们在运行包含此字符串的查询时遇到困难,我们试图对其进行 RTrim(视图返回大量尾随空格),然后与另一个字段连接。 但是,如果我们在此字段上使用 RTrim,则不会返回错误消息或 null 或类似的内容,而是根本不返回该行。我们没有尝试在 WHERE 子句或 JOIN 中使用它,这只是 SELECT ... FROM VIEWNAME 的一部分。查看视图后,似乎视图错误地将字符串的长度检测为 9 个字符(定义中未指定长度),而 RTrim 只是不起作用。 现在,我可以理解为什么这可能会导致错误消息或 SELECT 中的 NULL 值,但是为什么根本不会返回该行?这似乎不是好的 SQL 行为,我从未见过任何其他 RDBMS 发生这种情况。

其他信息:我们正在测试通过 ODBC 和 WinSQL 进行查询,以期将其包含在现有的 ASP.NET 应用程序中。除了通过这个,我们无权访问后端,尽管我们确实有权创建视图。

更新:作为一个奇怪的后续行动,我们现在发现,如果我们尝试在没有任何 WHERE 子句的情况下查询此视图,则不会返回任何记录。这可能有相同的原因。

【问题讨论】:

    标签: sql database string views openedge


    【解决方案1】:

    这听起来可能与进度数据库中的 SQL-WIDTH 有关。 Progress 的一个问题是,如果该字段的内容超过 SQL-WIDTH,那么您将得到奇怪的 SQL 行为(有时驱动程序可能会失败,有时您不会得到任何结果)。

    要确定这一点,您需要使用dbtool 命令检查可能超出的 SQL-WIDTH。

    【讨论】:

    • 读了一点之后,这听起来是一个奇怪但又似是而非的原因。遗憾的是,我无法确定地对其进行测试。
    • 您无权访问进度命令或进度 DBA 来为您验证宽度吗?进度数据库本质上非常奇怪,它们的行为与其他传统 SQL 数据库不同。
    【解决方案2】:

    确保没有空格。修剪不会只删除空格。空白也不是空值。字符集有所不同,而在您的编辑器中并没有明显不同。 我在几个数据库中遇到过这个问题,DBII、Oracle、PostGreSQL。检查编辑器的字符集并尝试查看表格,您可能什么也看不到,或者您可能会看到大矩形。

    【讨论】:

      【解决方案3】:

      这听起来很奇怪。只需围绕它编写代码,在应用程序中进行修剪和/或字符串操作,然后继续。

      【讨论】:

        猜你喜欢
        • 2016-02-24
        • 2012-09-24
        • 2012-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多