1

我已经处理了需要将数据从Oracle数据库转换到数据库的问题,SQL Server除了 SQL Server 迁移助手之外别无他法。

其中SSMA有一个TypeMapping允许您定义要转换的类型。我将 Raw[16](Guid in Oracle) 添加到 UniqueIdentifier(Guid in oracle) 作为TypeMapping.

但是当 SSMA 开始转换数据时,它会返回此异常:

来自数据源的 Byte[] 类型的给定值无法转换为指定目标列的 uniqueidentifier 类型。

4

3 回答 3

1

ORACLE SYS_GUID是 RAW(16),它是 32 个字符的十六进制表示。

等效的 SQL Server 数据类型 Uniqueidentifier 是 16 字节二进制值,即 36 个字符表示。 SQL Server 唯一标识符

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,其中每个 x 是 0-9 或 af 范围内的十六进制数字。例如,6F9619FF-8B86-D011-B42D-00C04FC964FF 是有效的唯一标识符值

您可以考虑以下选项:

  • 我建议您在类型映射中使用 VARCHAR(32) 来表示 SQLServer 中相应的 ORACLE GUID。

  • 您可以为目标列设置NEWID()的默认值,加载数据时将分配值

  • 拥有目标数据类型VARCHAR(36),一旦完成迁移,就可以开始使用 NEWID() 获取未来值。由于 GUID 将是唯一的,因此您不会遇到问题。
于 2019-04-24T04:29:34.013 回答
1
DECLARE @uniqORAconvMS varchar(32) = '5cf5d1b5db12d38067affb261d9619dc'

SELECT left(@uniqORAconvMS,8) + '-' + SUBSTRING(@uniqORAconvMS,9,4) + '-' + SUBSTRING(@uniqORAconvMS,13,4) + '-' + SUBSTRING(@uniqORAconvMS,17,4)  + '-' + RIGHT(@uniqORAconvMS,12)

-- xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
-- 5cf5d1b5-db12-d380-67af-fb261d9619dc

-- With TRY_CONVERT to check valid uniqueidentifier
SELECT TRY_CONVERT (UNIQUEIDENTIFIER, LEFT(@uniqORAconvMS,8) + '-' + SUBSTRING(@uniqORAconvMS,9,4) + '-' + SUBSTRING(@uniqORAconvMS,13,4) + '-' + SUBSTRING(@uniqORAconvMS,17,4) + '-' + RIGHT(@uniqORAconvMS,12))
于 2019-10-16T11:27:07.027 回答
0

马丁的回答有点不正确。如果您使用实体框架,您会注意到从 oracle 返回的 GUID 不仅被破折号分割,而且还重新排序。所以5cf5d1b5db12d38067affb261d9619dc应该成为b5d1f55c-12db-80d3-67af-fb261d9619dc,不是5cf5d1b5-db12-d380-67af-fb261d9619dc

DECLARE @uniqORAconvMS varchar(32) = '5cf5d1b5db12d38067affb261d9619dc';

SELECT SUBSTRING(@uniqORAconvMS,7,2) + SUBSTRING(@uniqORAconvMS,5,2) + SUBSTRING(@uniqORAconvMS,3,2) + SUBSTRING(@uniqORAconvMS,1,2) + '-' + SUBSTRING(@uniqORAconvMS,11,2) + SUBSTRING(@uniqORAconvMS,9,2) + '-' + SUBSTRING(@uniqORAconvMS,15,2) + SUBSTRING(@uniqORAconvMS,13,2) + '-' + SUBSTRING(@uniqORAconvMS,17,4)  + '-' + RIGHT(@uniqORAconvMS,12);
于 2020-12-02T20:37:07.680 回答