none
SQL Server Migration Assistant for Oracle - Probleme Konvertierung UUID RAW(16) zu uniqueidentifier RRS feed

  • Frage

  • Hallo

    Ich versuche ein UUID Feld von Oracle Typ RAW(16) nach SQL Server 2016 Typ uniqueidentifier zu migrieren.

    Die Erstellung der Tabelle funktioniert soweit. Dazu habe ich das "Colums type mapping" von raw zu uniqueidentifier umgestellt (war auf varbinary gesetzt).

    https://imgur.com/pH5DxaP

    Die Tabelle wird also korrekt mit uniqueidentifier angelegt.

    Probleme habe ich mit der Datenmigration. Dabei erhalte ich den folgenden Fehler:

    Der angegebene Wert vom Typ Byte[] aus der Datenquelle kann nicht in Typ uniqueidentifier der angegebenen Zielspalte konvertiert werden.

    https://imgur.com/Y6fsPUU

    Ich habe versucht über die "Extended data migration options" einen individuellen Select zwischenzuschalten.

    https://imgur.com/42gsK5P

    Die Spalte "UUID" habe ich ersetzt durch:

    LOWER(SUBSTR("UUID", 1, 8) || '-' || SUBSTR("UUID", 9, 4) || '-' || SUBSTR("UUID", 13, 4) || '-' || SUBSTR("UUID", 17, 4) || '-' || SUBSTR("UUID", 21, 12)) "UUID"

    https://imgur.com/fEkipRm

    Dies erstelt mir einen String der so aussieht:

    8e086d49-9bdb-4ae4-e053-638da8c044b5

    Aber das klappet auch nicht. Es erscheint der gleiche Fehler, nur an Stelle von "Byte[]" mit "String"

    Der angegebene Wert vom Typ String aus der Datenquelle kann nicht in Typ uniqueidentifier der angegebenen Zielspalte konvertiert werden.

    Die Datenmigration klappet wenn ich "UUID" durch NULL ersetze. Das nützt mir allerding nichts.

    Gibt es eine Lösung wie ich die UUID's korrekt in die uniqueidentifiers reinkriege?
    Montag, 14. Oktober 2019 10:04

Alle Antworten

  • Der Datentyp entspricht GUID:
    https://www.sqlshack.com/understanding-the-guid-data-type-in-sql-server/
    Montag, 14. Oktober 2019 10:49
  • Auf Oracle Seite ist GUID RAW(16). Genau das führt zum Fehler. Offenbar kann der Migration Assistant standardmässig kein GUID von Oracle in ein GUID von MSSQL umzuwandeln. Deshalb versuche ich den Select für das Oracle manuell anzupassen

    Allerdings weiss ich nicht wie der Migration Assistant das Insert Statement generiert. Deshalb weiss ich auch nicht wie ich den Select für das Oracle modifizieren muss.

    Dieser Insert funktioniert. Der String wird automatisch in die GUID gecastet:

    INSERT INTO [DT401]
               ([DI000001]
               ,[UUID])
         VALUES
               ('1234'
               ,'8e086d49-9bdb-4ae4-e053-638da8c044b5')
    GO

    Also habe ich versucht die UUID in diesem Format aus Oracle als String auszulesen. Aber das führt auch zum Fehler.

    Montag, 14. Oktober 2019 11:24
  • Versuche es mal mit cast('8e086d49-9bdb-4ae4-e053-638da8c044b5' as uniqueidentifier).
    • Bearbeitet bfuerchau Montag, 14. Oktober 2019 13:28
    Montag, 14. Oktober 2019 12:58
  • Versuche es mal mit cast('8e086d49-9bdb-4ae4-e053-638da8c044b5' as uniqueidentifier).

    Das geht nicht. Der Select wird im Oracle (Quelle) ausgeführt. Oracle kennt kein Typ uniqueidentifier.

    Wenn dann müsste ich den Insert im Ziel (SQL Server) anpassen. Aber diese Möglichkeit scheint es nicht zu geben.

    Der Fehler "Der angegebene Wert vom Typ Byte[] aus der Datenquelle kann nicht in Typ uniqueidentifier der angegebenen Zielspalte konvertiert werden." scheint eine Exception vom .Net zu sein. Also ich glaube es ist kein Problem der Datenbank(en) selbst, sondern wie der Assistent die Typen casten will vor dem Generieren des Insert Statements.

    Montag, 14. Oktober 2019 13:56
  • Dann hilft dir halt nur eine 2-stufige Migration.
    Importiere die UUID as char(16) und im 2. Step machst du einen

    update table set myid = cast(uuid as uniqueidentifier)

    Was anderes fällt mir dazu halt nicht ein.

    Montag, 14. Oktober 2019 14:22
  • Dann hilft dir halt nur eine 2-stufige Migration.
    Importiere die UUID as char(16) und im 2. Step machst du einen

    update table set myid = cast(uuid as uniqueidentifier)

    Was anderes fällt mir dazu halt nicht ein.

    Jo Danke für deine Zeit

    Soweit war ich auch schon. Das wäre sehr aufwändig. Die Datenbank hat ca 500 Tabellen. Die Typenumwandung kann man nicht ohne Weiteres durchführen weil es Indices, Constraints und Defaultwerte auf dem UUID Feld drauf hat.


    • Bearbeitet Clemaram Montag, 14. Oktober 2019 14:43
    Montag, 14. Oktober 2019 14:43
  • Vielleicht hilft das ja weiter:

    https://docs.microsoft.com/de-de/sql/ssma/oracle/what-s-new-in-ssma-for-oracle-oracletosql?view=sql-server-ver15

    SSMA v 7.8

    Das Release v 7.8 von SSMA für Oracle enthält die folgenden Änderungen:

    Unterstützung für:
    • Zeilen Ausdruck für die in-Klausel.
    • Implizite Typumwandlungen.
    • UID-Konvertierung für Azure SQL-Datenbank.

    Montag, 14. Oktober 2019 15:38
  • Hallo Clemaram,

    Bist Du mit der zweistufigen Migration oder mit der UID-Konvertierung für Azure SQL-Datenbank weitergekommen? Ist der Thread noch aktuell?

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 25. Oktober 2019 13:45
    Moderator