添加ORDER BY时出现“SQL0802 - 数据映射错误的数据转换”异常

问题描述 投票:0回答:1

我偶尔遇到的情况(不是所有数据集)我得到“错误: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任何字段时,我收到此错误。

tsql db2 ibm-midrange
1个回答
0
投票

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

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

并且总是立即引出错误的两件事是对结果进行排序或分页。这是因为为了排序,它必须击中每个关键字段,然后缓存完整的结果。我认为。就像我说的那样,我不知道完整的技术,但我很确定这与laygeek术语相近。

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

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)

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

© www.soinside.com 2019 - 2024. All rights reserved.