在MSDASQL中带有WHERE子句的子字符串导致错误



我正在测试Progress OpenEdge应用程序中的一个功能,该功能可以将数据加载到DB表中。我正在测试的表中的许多字段被我们的应用程序限制为256个字符,因此我正在进行一些边缘情况测试,尝试加载小于、等于和大于256个字符的条目。在数据加载之后,我查询DB并验证结果。我通过测试程序TestComplete使用ODBC驱动程序的OLE DB提供程序。这是我使用的查询:

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更改设置的情况下做到这一点—为了使测试准确,对我来说,在DB中具有特定的设置非常重要。

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

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

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

在"解决"这个问题方面-要么缩短数据,要么为这些字段设置更大的SQL-WIDTH或MAX-WIDTH。

这是关于这个话题的知识库:http://knowledgebase.progress.com/articles/Article/P162121

这里有一个关于处理"太大"列的知识库:http://knowledgebase.progress.com/articles/Article/P126779?q=SQL%3A +数据+截断+和+无效+长+数据+和+误差放大器;l = en_US&类型= Article__kav& fs = Search& pn = 1

最新更新