MSDASQL中带有WHERE子句的SUBSTRING会导致错误

时间:2014-07-02 21:19:37

标签: openedge testcomplete progress-db msdasql

我正在测试Progress OpenEdge应用程序中的一项功能,该功能将数据加载到数据库表中。表I测试中的许多字段都受到我们的应用程序限制为256个字符,所以我做了一些边缘案例测试,试图加载小于,等于和大于的条目256个字符。加载数据后,我查询数据库并验证结果。我通过测试程序TestComplete将OLE DB提供程序用于ODBC驱动程序。这是我使用的查询:

SELECT SUBSTRING(lname, 1, 30)
FROM pub.referral
WHERE lname LIKE 'valid%'

在我运行测试之前,ODBC驱动程序对此查询没有任何问题。但是,在运行它之后,此表中的字段有256个字符,并且ODBC驱动程序存在该长度数据的问题。我想通过使用SUBSTRING来避免这种情况,但是当我尝试使用此查询时仍然会出现验证错误:

The specified query is invalid. Database engine reports: [DataDirect][ODBC Progress OpenEdge Wire Protocol driver]Error in row

资料性!当表中的数据比ODBC更长时,我通常会看到这个错误。但奇怪的是,如果我取出WHERE子句,查询将验证并返回30个字符块中的数据,就像我在SUBSTRING中指定的那样。

这是否发生是因为我在字段中有比ODBC驱动程序所期望的更多字符,或者因为与WHERE子句有关的其他内容(语法不正确等等?)我怎样才能解决这个问题? ?我想在不通过dbtool更改设置的情况下执行此操作 - 对我来说,拥有我在数据库中的特定设置对我的测试是准确的非常重要。

1 个答案:

答案 0 :(得分:1)

我怀疑引擎正在读取不匹配的记录以查看它们是否与WHERE条件匹配。如果不匹配的记录的字段长于其SQL-WIDTH / MAX-WIDTH设置,那么可能会给出您正在查看的结果。

不使用WHERE子句进行搜索意味着每条记录都是结果集的一部分,并且在输出之前将由SUBSTRING()命令处理。

测试此方法的一种方法是使用相等匹配执行WHERE - 引擎应该只读取与WHERE规范匹配的记录,执行SUBSTRING()并按预期工作。

在"四处走动"这 - 缩短数据或使这些字段的SQL-WIDTH或MAX-WIDTH设置更大。

这是关于该主题的KB: http://knowledgebase.progress.com/articles/Article/P162121

这是一个关于处理"太大"的KB。列: http://knowledgebase.progress.com/articles/Article/P126779?q=SQL%3A+Data+truncated+and+Invalid+long+datatype+and+error&l=en_US&type=Article__kav&fs=Search&pn=1