添加ORDER BY

时间:2015-05-13 14:58:01

标签: tsql db2 ibm-midrange

我偶尔遇到的情况是偶尔(不是所有数据集)我得到“错误:SQL0802 - 数据转换或数据映射错误。”将ORDER BY添加到简单查询时的异常。例如,这有效:

SELECT
    market,
    locationCode,
    locationName
FROM locations

以下是悲惨的失败:

SELECT
    market,
    locationCode,
    locationName
FROM locations
ORDER BY locationName

我收到了:错误:SQL0802 - 数据转换或数据映射错误。 (状态:S1000,原生代码:FFFFFCDE)

如果我尝试按名称,人口或任何真实的东西排序,我会得到同样的错误....但有时候,这意味着,当它在名称或代码上出错时,如果按位置中的任何字段排序,则会出错子集。如果它适用于特定的位置子集,则它适用于任何排序顺序。

任何字段都没有空值,代码和名称字段是字符字段。

最初,当我添加ROW_NUMBER列时出现此错误:

ROW_NUMBER() OVER(PARTITION BY market ORDER BY locationCode) as rowNumber

因为,我把它缩小到订单失败的情况。我不知道要用哪个方向。有什么想法吗?

更新:位置名称字段没有空白值。即使我删除了此子集中的所有字段,只留下7位数字ID并按该字段排序。我仍然得到同样的错误。

WITH locs as (
    SELECT id
    FROM locations
)
SELECT *
FROM locs
ORDER BY id

当我从子集中选择DISTINCT任何字段时,我收到此错误。

1 个答案:

答案 0 :(得分:0)

我有/所描述的完全相同的情况。错误似乎是随机的,但在添加排序时总会出现。虽然我无法准确描述技术细节,但我认为正在发生的是随机性"实际上是由于表的大小,以及查询中返回的行的缓存块的大小。

问题的实际原因是连接使用的关键字段中的垃圾值和/或空白。如果没有排序,并且第一批缓存结果没有用坏字段命中记录,则错误最初不会发生......但最终总是会发生错误。

总是提出错误的两件事情是立即对结果进行排序或分页。这是因为为了排序,它必须点击每个关键字段,然后缓存完整的结果。我认为。就像我说的那样,我不知道完整的技术问题,但我非常确定它与非专业人士的关系。

我能够通过强制将键列强制转换为整数来解决错误。我改变了这个联接......

FROM DAILYV INNER JOIN BXV ON DAILYV.DAITEM=BXV.BXPACK

......对此...

FROM DAILYV INNER JOIN BXV ON CAST(DAILYV.DAITEM AS INT)=CAST(BXV.BXPACK AS INT)

......我没有必要对表格进行任何更正。这是一个非常古老,非常混乱的数据库,里面有很多垃圾。已经进行了更正,但这是一项正在进行中的工作。