You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SQL将Oracle RAW(16)转换为.NET GUID及解决ORA-00936报错

ORA-00936报错修复

报错原因:Oracle语法规定,当SELECT子句同时包含指定列和通配符*时,通配符必须加表前缀/表别名前缀,否则会触发缺少表达式错误。另外如果Raw16Column本身就是RAW(16)类型,不需要调用hextoraw(该函数作用是将十六进制字符串转为RAW类型,直接套在RAW类型字段上会触发隐式转换错误)。
修复后的SQL:

select p.Raw16Column, p.*
from OracleDb.PRODUCTS p
order by p.PRODUCTS_ID desc
fetch next 20 rows only

Oracle RAW(16)转MSSQL GUID类型方案

首先明确字节序差异:MSSQL的GUID(UNIQUEIDENTIFIER类型)遵循Windows平台小端序规则,而Oracle RAW(16)如果存储的是.NET生成的GUID,前三段字节为倒序存储,需要先做字节顺序调整再迁移。

方案1:Oracle端预处理为MSSQL兼容的GUID字符串

使用rawtohex函数将RAW(16)转十六进制字符串后,调整字节顺序并拼接为GUID格式:

select 
  lower(
    -- 调整前4字节顺序
    substr(rawtohex(Raw16Column), 7, 2) || substr(rawtohex(Raw16Column), 5, 2) || substr(rawtohex(Raw16Column), 3, 2) || substr(rawtohex(Raw16Column), 1, 2) || '-' ||
    -- 调整接下来2字节顺序
    substr(rawtohex(Raw16Column), 11, 2) || substr(rawtohex(Raw16Column), 9, 2) || '-' ||
    -- 调整接下来2字节顺序
    substr(rawtohex(Raw16Column), 15, 2) || substr(rawtohex(Raw16Column), 13, 2) || '-' ||
    -- 剩余后8字节顺序不变
    substr(rawtohex(Raw16Column), 17, 4) || '-' ||
    substr(rawtohex(Raw16Column), 21, 12)
  ) as mssql_compatible_guid
from OracleDb.PRODUCTS

生成的字符串可以直接插入MSSQL的UNIQUEIDENTIFIER类型字段。

方案2:迁移到MSSQL后转换

如果已经将RAW(16)字段原样迁移为MSSQL的BINARY(16)/VARBINARY(16)类型,直接执行类型转换即可:

SELECT CAST(your_binary_column AS UNIQUEIDENTIFIER) AS mssql_guid FROM your_table

注意:如果Oracle存储的RAW(16)是标准大端序UUID,不需要做字节序调整,直接迁移后转换即可。

内容的提问来源于stack exchange,提问作者mattsmith5

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:24:05