我偶尔遇到的情况是偶尔(不是所有数据集)我得到“错误: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任何字段时,我收到此错误。
答案 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)
......我没有必要对表格进行任何更正。这是一个非常古老,非常混乱的数据库,里面有很多垃圾。已经进行了更正,但这是一项正在进行中的工作。