Aller au contenu
Accueil IntoSQL

Convertir Oracle en SQL Server

Déposez le fichier .sql qu'écrit Database Export de SQL Developer ou SQLcl, avec ses tables et ses instructions Insert, et téléchargez un script SQL Server avec les mêmes tables, clés, index et données. Chaque valeur que SQL Server ne peut pas contenir telle quelle, et chaque objet qu'il ne reprend pas, est listé dans le rapport.

Votre fichier
sqlshop_2024_oracle.sqlFichier d'exemple, 9,3 ko
Votre base de données

18 lignes converties, 2 corrections, aucune rejetée

Afficher

Tables de shop_2024_oracle.sqlDump Oracle · écrit par SQL Developer · utf-8

  • customers8 lignes1
    7 colonnes
    idbigint not null
    namenvarchar(200) not null
    emailnvarchar(150) not null
    countrynvarchar(2) not null
    is_activesmallint not null
    signed_updatetime2(0)
    created_atdatetime2(0) not null
  • orders10 lignes1
    9 colonnes
    idbigint not null
    customer_idbigint not null
    invoicebigint
    statusnvarchar(10) not null
    totaldecimal(10,2) not null
    itemsint not null
    ordered_atdatetime2(0) not null
    shipped_atdatetime2(0)
    notenvarchar(510)
-- Written by IntoSQL from a Oracle dump. Load it with: sqlcmd -b -f 65001 -d <database> -i <file>
SET NOCOUNT ON;
SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
SET ANSI_PADDING ON;
SET ANSI_WARNINGS ON;
SET ARITHABORT ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET NUMERIC_ROUNDABORT OFF;
GO

CREATE SEQUENCE [dbo].[invoice_numbers] AS bigint START WITH 1020 INCREMENT BY 1 MINVALUE 1;
GO
CREATE TABLE [dbo].[customers] (
    [id] bigint IDENTITY(1, 1) NOT NULL,
    [name] nvarchar(200) COLLATE Latin1_General_100_BIN2 NOT NULL,
    [email] nvarchar(150) COLLATE Latin1_General_100_BIN2 NOT NULL,
    [country] nvarchar(2) COLLATE Latin1_General_100_BIN2 DEFAULT N'US' NOT NULL,
    [is_active] smallint DEFAULT 1 NOT NULL,
    [signed_up] datetime2(0) NULL,
    [created_at] datetime2(0) DEFAULT SYSDATETIME() NOT NULL,
    CONSTRAINT [check1] CHECK ([is_active] IN (0, 1)),
    CONSTRAINT [PK_customers] PRIMARY KEY ([id])
);
GO

CREATE TABLE [dbo].[orders] (
    [id] bigint IDENTITY(1, 1) NOT NULL,
    [customer_id] bigint NOT NULL,
    [invoice] bigint DEFAULT (NEXT VALUE FOR [dbo].[invoice_numbers]) NULL,
    [status] nvarchar(10) COLLATE Latin1_General_100_BIN2 DEFAULT N'pending' NOT NULL,
    [total] decimal(10,2) NOT NULL,
    [items] int DEFAULT 1 NOT NULL,
    [ordered_at] datetime2(0) NOT NULL,
    [shipped_at] datetime2(0) NULL,
    [note] nvarchar(510) COLLATE Latin1_General_100_BIN2 NULL,
    CONSTRAINT [check1_2] CHECK ([status] IN (N'pending', N'paid', N'shipped', N'cancelled')),
    CONSTRAINT [PK_orders] PRIMARY KEY ([id])
);
GO

SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(1,N'Ana Martínez',N'ana@example.com',N'MX',1,'2023-01-15 00:00:00','2023-01-15 10:24:00.0000000');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(2,N'Zoë Müller',N'zoe@example.de',N'DE',1,'2023-02-03 00:00:00','2023-02-03 08:11:42.0000000');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(3,N'José Peña',N'jose@example.es',N'ES',0,'2023-03-21 00:00:00','2023-03-21 19:05:17.0000000');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(4,N'李雷',N'lilei@example.cn',N'CN',1,'2023-05-09 00:00:00','2023-05-09 02:40:00.0000000');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(5,N'Noah O''Brien',N'noah@example.ie',N'IE',1,NULL,'2023-06-30 14:00:00.0000000');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(6,N'Amélie Laurent',N'amelie@example.fr',N'FR',1,'2024-01-02 00:00:00','2024-01-02 09:30:00.0000000');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(7,N'Ravi Patel',N'ravi@example.in',N'IN',0,'2024-02-29 00:00:00','2024-02-29 23:59:59.0000000');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(8,N'Sofia Rossi 🌻',N'sofia@example.it',N'IT',1,'2024-04-12 00:00:00','2024-04-12 12:12:12.0000000');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [invoice], [status], [total], [items], [ordered_at], [shipped_at], [note]) VALUES
(1,1,1000,N'shipped',129.9,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [invoice], [status], [total], [items], [ordered_at], [shipped_at], [note]) VALUES
(2,2,1001,N'paid',54,1,'2024-03-02 11:15:00',NULL,N'Gift wrap 🎁');
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [invoice], [status], [total], [items], [ordered_at], [shipped_at], [note]) VALUES
(3,1,1002,N'cancelled',12.5,1,'2024-03-03 09:45:00',NULL,N'Customer changed their mind');
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [invoice], [status], [total], [items], [ordered_at], [shipped_at], [note]) VALUES
(4,4,1003,N'shipped',980,12,'2024-03-05 02:10:00','2024-03-07 08:00:00',N'请小心轻放');
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [invoice], [status], [total], [items], [ordered_at], [shipped_at], [note]) VALUES
(5,5,1004,N'pending',45.75,2,'2024-03-08 17:20:00',NULL,N'Leave at the door; ring twice');
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [invoice], [status], [total], [items], [ordered_at], [shipped_at], [note]) VALUES
(6,6,1005,N'shipped',310.4,5,'2024-03-10 13:00:00','2024-03-11 09:00:00',N'Fragile: "glass"');
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [invoice], [status], [total], [items], [ordered_at], [shipped_at], [note]) VALUES
(7,8,1006,N'paid',76.2,2,'2024-03-11 18:45:00',NULL,NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [invoice], [status], [total], [items], [ordered_at], [shipped_at], [note]) VALUES
(8,2,1007,N'paid',19.99,1,'2024-03-12 08:00:00',NULL,N'Paid at the counter');
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [invoice], [status], [total], [items], [ordered_at], [shipped_at], [note]) VALUES
(9,3,1008,N'shipped',64,2,'2024-03-14 15:30:00',NULL,N'Shipping date never recorded');
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [invoice], [status], [total], [items], [ordered_at], [shipped_at], [note]) VALUES
(10,7,1009,N'paid',1499,1,'2024-03-15 21:05:00',NULL,N'C:\Users\ravi\invoice.pdf');
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO

-- Indexes, foreign keys, counters and triggers, after the rows.
CREATE UNIQUE INDEX [customers_email_uk] ON [dbo].[customers] ([email]);
CREATE INDEX [orders_status_date_ix] ON [dbo].[orders] ([status], [ordered_at]);
ALTER TABLE [dbo].[orders] WITH NOCHECK ADD CONSTRAINT [orders_customer_fk] FOREIGN KEY ([customer_id]) REFERENCES [dbo].[customers] ([id]);
BEGIN TRY ALTER TABLE [dbo].[orders] WITH CHECK CHECK CONSTRAINT [orders_customer_fk]; END TRY BEGIN CATCH PRINT N'Foreign key ' + N'[orders_customer_fk]' + N' has rows without a parent: it stays unchecked, and new rows are checked.'; END CATCH;
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[customers]); IF @next IS NOT NULL BEGIN IF @next < 0 SET @next = 0; DBCC CHECKIDENT (N'[dbo].[customers]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = N'People who bought at least once', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'customers';
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[orders]); IF @next IS NOT NULL BEGIN IF @next < 0 SET @next = 0; DBCC CHECKIDENT (N'[dbo].[orders]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
GO

Corrections

  1. "name" de customers contient des caractères que SQL Server compte double, comme les emoji ; elle est donc en nvarchar(200).
  2. "note" de orders contient des caractères que SQL Server compte double, comme les emoji ; elle est donc en nvarchar(510).

Votre fichier est converti sur cet ordinateur et n'est jamais envoyé.

Autres exemples :

Ce qui change de Oracle à SQL Server

Chaque ligne est une règle appliquée par le convertisseur, avec la ligne de rapport qu'il écrit quand la règle change quelque chose dans vos données.

  • BOOLEAN (23ai)

    bit

    SQL Server n'a pas de colonne booléenne ; TRUE et FALSE deviennent donc 1 et 0.

  • VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG

    nvarchar(n), nchar(n) et nvarchar(max)

    Les longueurs comptent les caractères, qu'Oracle ait compté des octets ou des caractères, donc chaque valeur tient.

  • VARCHAR2 and NVARCHAR2 past what the target's own types hold

    nvarchar(2n), ou nvarchar(max) au-delà de 4000

    nvarchar compte en unités UTF-16 et un emoji en prend deux ; la colonne a donc la place pour chaque valeur.

    Ligne du rapport: text_length_widened

  • NUMBER, NUMBER(p,s), FLOAT(b)

    decimal(p,s), ou bigint

    NUMBER garde chaque chiffre ; un NUMBER sans précision dont toutes les valeurs sont des nombres entiers de 18 chiffres au plus est un entier 64 bits, et une échelle négative garde autant de chiffres avant la virgule.

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    nvarchar(100) avec le texte d'Oracle, comme +01-06

    SQL Server n'a pas de type intervalle ; le texte en garde chaque partie.

    Ligne du rapport: type_replaced

  • DATE, TIMESTAMP(p)

    datetime2(p)

    Le DATE d'Oracle contient une heure à la seconde près ; c'est donc une date et une heure. Un export dans une session américaine ou allemande écrit les dates sans leur heure ni leur siècle (DD-MON-RR) ; exportez dans une session ISO (SYYYY-MM-DD HH24:MI:SS) pour les garder.

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    datetimeoffset, avec le décalage de chaque valeur

    Le même type et les mêmes valeurs.

  • JSON (21c), and CLOB holding JSON

    nvarchar(max)

    Les mêmes valeurs JSON ; un NULL SQL que l'export a écrit 'null' reste NULL.

  • BLOB, RAW(n), LONG RAW

    binary(n), varbinary(n) et varbinary(max)

    Les octets restent des octets.

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    nvarchar(max), et xml pour XMLTYPE

    Les types propres à Oracle n'ont pas d'équivalent ; leurs valeurs gardent leur texte, valeurs ROWID comprises, même si elles n'ont aucun sens hors d'Oracle.

  • collations that ignore case (BINARY_CI)

    la même collation sur chaque colonne

    Les colonnes comparent et trient comme avant, et les clés uniques distinguent les mêmes lignes.

  • identity columns, and a sequence a BEFORE INSERT trigger assigns

    IDENTITY, qui reprend après l'identifiant le plus élevé

    Les identifiants copiés se chargent tels quels, et le compteur reprend après le plus élevé. Une colonne qu'un déclencheur remplit depuis une séquence (la méthode d'avant 12c) devient aussi une colonne d'identité.

  • identity columns the target can't count

    un entier simple

    SQL Server compte une colonne IDENTITY par table ; toute autre garde ses valeurs sans compteur.

    Ligne du rapport: counter_dropped

  • CREATE SEQUENCE

    CREATE SEQUENCE avec les mêmes options

    L'export écrit où en est une séquence comme son START WITH ; elle reprend donc à partir de là.

  • virtual columns (GENERATED ALWAYS AS ... VIRTUAL)

    colonnes calculées

    SQL Server les calcule à partir de la même formule ; les valeurs que l'export a écrites pour elles sont omises.

  • virtual columns with functions IntoSQL doesn't write, and the || operator

    une colonne simple

    Une formule qui ne peut pas être écrite pour SQL Server laisse une colonne simple et une ligne dans le rapport ; les valeurs que l'export a écrites pour les colonnes virtuelles sont omises, et SQL Server ne peut pas les calculer.

    Ligne du rapport: generated_not_translated

  • defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)

    aucune valeur par défaut

    Une valeur par défaut qui ne peut pas être écrite est omise et signalée.

    Ligne du rapport: default_not_translated

  • CHECK constraints

    traduites

    Les mêmes contraintes CHECK, vérifiées au chargement de chaque ligne.

  • CHECK constraints with functions IntoSQL doesn't write

    non créée

    Une contrainte CHECK qui ne peut pas être écrite est omise et signalée.

    Ligne du rapport: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    non créée

    Oracle n'applique pas ces contraintes CHECK aux lignes déjà présentes, qui peuvent donc les enfreindre.

    Ligne du rapport: check_not_enforced

  • function-based, bitmap and domain indexes

    non créée

    IntoSQL écrit des index b-tree sur des colonnes entières ; recréez les autres après le chargement.

    Ligne du rapport: index_skipped

  • foreign keys

    après les données WITH NOCHECK, puis vérifiée avec un avertissement sur les orphelins

    La clé est créée après les lignes et vérifiée en dernier ; des lignes sans parent la laissent non vérifiée avec un avertissement au lieu d'arrêter le chargement.

  • ON DELETE CASCADE that cascades in a cycle or along a second path

    NO ACTION

    SQL Server refuse les cascades qui bouclent ou prennent un second chemin ; la clé est donc créée sans cette action et le rapport la nomme.

    Ligne du rapport: foreign_key_action_dropped

  • foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones

    non créée

    Une clé ne peut pas désigner une table absente, et une clé qu'Oracle ne vérifie pas peut avoir des lignes sans parent.

    Ligne du rapport: foreign_key_skipped

  • partitioned tables

    une seule table avec les lignes de chaque partition

    Les lignes sont les mêmes ; partitionnez à nouveau la table dans SQL Server si besoin.

    Ligne du rapport: partitions_dropped

  • NOT NULL columns with values that become NULL

    NOT NULL retiré

    Une colonne dont des valeurs ont dû devenir NULL ne peut pas garder NOT NULL, sinon le chargement s'arrêterait.

    Ligne du rapport: not_null_relaxed

  • views, synonyms, types, packages, procedures, functions and other triggers

    listés dans le rapport

    Leur code est écrit en PL/SQL ; ils sont donc listés pour que vous les recréiez.

    Ligne du rapport: not_converted_objects

  • exports without CREATE TABLE (data only)

    types déduits des valeurs

    Un export de données seules ne contient que des lignes, donc les types viennent des valeurs.

    Ligne du rapport: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    Un convertisseur qui n'exécute pas de base de données ne peut pas les évaluer ; to_date, to_timestamp, TO_CLOB, HEXTORAW et les autres que les exports écrivent sont lus.

    Ligne du rapport: expression_value

  • types IntoSQL doesn't know, and object types

    nvarchar(max)

    Le texte contient n'importe quelle valeur ; changez le type après le chargement.

    Ligne du rapport: unknown_type

  • dates before year 1 and time zones given as region names

    NULL

    Une valeur qui n'est pas une date devient NULL et le rapport la compte.

    Ligne du rapport: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    NULL

    Les types à virgule flottante de SQL Server n'ont ni NaN ni infini ; ces valeurs deviennent donc NULL et le rapport les compte.

    Ligne du rapport: invalid_value_null

  • NUL characters in text

    conservé

    nvarchar peut contenir un caractère NUL, donc la valeur est copiée telle quelle.

  • text that isn't valid in its encoding

    les octets invalides deviennent le caractère de remplacement

    Le script est en UTF-8 et chaque valeur doit être du texte valide.

    Ligne du rapport: invalid_utf8_replaced

  • text decoded twice (ñ)

    copié tel quel

    Le script contient exactement ces caractères, ils sont donc copiés ; le rapport les signale.

    Ligne du rapport: mojibake_suspected

Dans OracleDans SQL ServerLigne du rapport
BOOLEAN (23ai)bitSQL Server n'a pas de colonne booléenne ; TRUE et FALSE deviennent donc 1 et 0.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGnvarchar(n), nchar(n) et nvarchar(max)Les longueurs comptent les caractères, qu'Oracle ait compté des octets ou des caractères, donc chaque valeur tient.
VARCHAR2 and NVARCHAR2 past what the target's own types holdnvarchar(2n), ou nvarchar(max) au-delà de 4000nvarchar compte en unités UTF-16 et un emoji en prend deux ; la colonne a donc la place pour chaque valeur.text_length_widened
NUMBER, NUMBER(p,s), FLOAT(b)decimal(p,s), ou bigintNUMBER garde chaque chiffre ; un NUMBER sans précision dont toutes les valeurs sont des nombres entiers de 18 chiffres au plus est un entier 64 bits, et une échelle négative garde autant de chiffres avant la virgule.
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECONDnvarchar(100) avec le texte d'Oracle, comme +01-06SQL Server n'a pas de type intervalle ; le texte en garde chaque partie.type_replaced
DATE, TIMESTAMP(p)datetime2(p)Le DATE d'Oracle contient une heure à la seconde près ; c'est donc une date et une heure. Un export dans une session américaine ou allemande écrit les dates sans leur heure ni leur siècle (DD-MON-RR) ; exportez dans une session ISO (SYYYY-MM-DD HH24:MI:SS) pour les garder.
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONEdatetimeoffset, avec le décalage de chaque valeurLe même type et les mêmes valeurs.
JSON (21c), and CLOB holding JSONnvarchar(max)Les mêmes valeurs JSON ; un NULL SQL que l'export a écrit 'null' reste NULL.
BLOB, RAW(n), LONG RAWbinary(n), varbinary(n) et varbinary(max)Les octets restent des octets.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYnvarchar(max), et xml pour XMLTYPELes types propres à Oracle n'ont pas d'équivalent ; leurs valeurs gardent leur texte, valeurs ROWID comprises, même si elles n'ont aucun sens hors d'Oracle.
collations that ignore case (BINARY_CI)la même collation sur chaque colonneLes colonnes comparent et trient comme avant, et les clés uniques distinguent les mêmes lignes.
identity columns, and a sequence a BEFORE INSERT trigger assignsIDENTITY, qui reprend après l'identifiant le plus élevéLes identifiants copiés se chargent tels quels, et le compteur reprend après le plus élevé. Une colonne qu'un déclencheur remplit depuis une séquence (la méthode d'avant 12c) devient aussi une colonne d'identité.
identity columns the target can't countun entier simpleSQL Server compte une colonne IDENTITY par table ; toute autre garde ses valeurs sans compteur.counter_dropped
CREATE SEQUENCECREATE SEQUENCE avec les mêmes optionsL'export écrit où en est une séquence comme son START WITH ; elle reprend donc à partir de là.
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)colonnes calculéesSQL Server les calcule à partir de la même formule ; les valeurs que l'export a écrites pour elles sont omises.
virtual columns with functions IntoSQL doesn't write, and the || operatorune colonne simpleUne formule qui ne peut pas être écrite pour SQL Server laisse une colonne simple et une ligne dans le rapport ; les valeurs que l'export a écrites pour les colonnes virtuelles sont omises, et SQL Server ne peut pas les calculer.generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)aucune valeur par défautUne valeur par défaut qui ne peut pas être écrite est omise et signalée.default_not_translated
CHECK constraintstraduitesLes mêmes contraintes CHECK, vérifiées au chargement de chaque ligne.
CHECK constraints with functions IntoSQL doesn't writenon crééeUne contrainte CHECK qui ne peut pas être écrite est omise et signalée.check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATEnon crééeOracle n'applique pas ces contraintes CHECK aux lignes déjà présentes, qui peuvent donc les enfreindre.check_not_enforced
function-based, bitmap and domain indexesnon crééeIntoSQL écrit des index b-tree sur des colonnes entières ; recréez les autres après le chargement.index_skipped
foreign keysaprès les données WITH NOCHECK, puis vérifiée avec un avertissement sur les orphelinsLa clé est créée après les lignes et vérifiée en dernier ; des lignes sans parent la laissent non vérifiée avec un avertissement au lieu d'arrêter le chargement.
ON DELETE CASCADE that cascades in a cycle or along a second pathNO ACTIONSQL Server refuse les cascades qui bouclent ou prennent un second chemin ; la clé est donc créée sans cette action et le rapport la nomme.foreign_key_action_dropped
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE onesnon crééeUne clé ne peut pas désigner une table absente, et une clé qu'Oracle ne vérifie pas peut avoir des lignes sans parent.foreign_key_skipped
partitioned tablesune seule table avec les lignes de chaque partitionLes lignes sont les mêmes ; partitionnez à nouveau la table dans SQL Server si besoin.partitions_dropped
NOT NULL columns with values that become NULLNOT NULL retiréUne colonne dont des valeurs ont dû devenir NULL ne peut pas garder NOT NULL, sinon le chargement s'arrêterait.not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggerslistés dans le rapportLeur code est écrit en PL/SQL ; ils sont donc listés pour que vous les recréiez.not_converted_objects
exports without CREATE TABLE (data only)types déduits des valeursUn export de données seules ne contient que des lignes, donc les types viennent des valeurs.no_schema
expressions in INSERT values other than the ones exports writeNULLUn convertisseur qui n'exécute pas de base de données ne peut pas les évaluer ; to_date, to_timestamp, TO_CLOB, HEXTORAW et les autres que les exports écrivent sont lus.expression_value
types IntoSQL doesn't know, and object typesnvarchar(max)Le texte contient n'importe quelle valeur ; changez le type après le chargement.unknown_type
dates before year 1 and time zones given as region namesNULLUne valeur qui n'est pas une date devient NULL et le rapport la compte.date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLENULLLes types à virgule flottante de SQL Server n'ont ni NaN ni infini ; ces valeurs deviennent donc NULL et le rapport les compte.invalid_value_null
NUL characters in textconservénvarchar peut contenir un caractère NUL, donc la valeur est copiée telle quelle.
text that isn't valid in its encodingles octets invalides deviennent le caractère de remplacementLe script est en UTF-8 et chaque valeur doit être du texte valide.invalid_utf8_replaced
text decoded twice (ñ)copié tel quelLe script contient exactement ces caractères, ils sont donc copiés ; le rapport les signale.mojibake_suspected

Charger le script dans SQL Server

Le script crée les tables, copie les lignes, puis ajoute les clés, les index et les clés étrangères ; il se charge donc vite et s'arrête à la première erreur.

sqlcmd -b -f 65001 -S localhost -d mydb -i oracle.sql_server.sql

Les clés étrangères sont ajoutées WITH NOCHECK, puis vérifiées. Si une ligne pointe vers une ligne qui n'existe pas, le script indique quelle contrainte et la laisse non vérifiée, au lieu d'échouer à mi-chemin.

Pour un gros dump, exécutez sqlcmd sur la machine du serveur. Chaque lot de 1000 lignes au plus est validé à part, donc le journal des transactions reste petit.

Faire le dump Oracle pour un meilleur résultat

Le convertisseur lit ce que contient le dump. Ces options y gardent davantage de vos données :

  • Dans SQL Developer, choisissez Tools, Database Export, avec DDL et le format de données Insert. SQLcl écrit la même chose avec SET SQLFORMAT INSERT.
  • Exécutez ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' avant l'export : le format par défaut écrit les dates sans leur heure ni leur siècle.
  • Un fichier .dmp de exp ou expdp est binaire : importez-le dans une base Oracle, par exemple Oracle Database Free dans Docker, et exportez-le avec SQL Developer.

Ce qui n'est pas converti

Les vues, packages, procédures, fonctions, déclencheurs, types et synonymes sont écrits en PL/SQL. Ils sont listés par nom dans le rapport, jamais supprimés en silence, pour que vous puissiez les réécrire pour SQL Server.

Questions sur Oracle vers SQL Server

Pas de réponse ici ? Écrivez-nous depuis la page de contact, une personne vous répond. Page de contact

Mon dump est-il envoyé ?

Non. Le convertisseur s'exécute dans votre navigateur et lit le dump depuis votre disque par morceaux ; il ne quitte donc jamais votre ordinateur. L'application de bureau et la ligne de commande convertissent aussi sur votre ordinateur.

Quelle taille peut avoir le dump ?

Le convertisseur ne garde jamais tout le dump en mémoire : il lit le fichier deux fois, par plages, et écrit le script au fur et à mesure. Les dumps de plusieurs gigaoctets se convertissent dans le navigateur, dans l'application de bureau et avec la ligne de commande.

Puis-je convertir un fichier .dmp de exp ou expdp ?

Pas directement : Data Pump et l'Export d'origine écrivent un format binaire que seul Oracle lit. Importez-le dans n'importe quelle base Oracle, Oracle Database Free tourne dans Docker, et exportez-le avec Database Export de SQL Developer ou SQLcl. Le convertisseur le signale quand il reçoit un fichier .dmp.

De quelles versions de Oracle l'export peut-il venir ?

Les exports de SQL Developer et SQLcl, avec les définitions de tables de DBMS_METADATA, depuis Oracle 11g. Chaque export de test vient de Oracle 21c et 23ai, dans des sessions américaine, allemande et ISO, et est comparé à sa source cellule par cellule.

Que deviennent NUMBER, DATE et les autres types Oracle ?

NUMBER devient decimal, ou bigint pour les nombres entiers ; DATE devient datetime2(0) et garde son heure ; le texte nvarchar, comparé exactement comme dans Oracle ; CLOB nvarchar(max), BLOB varbinary(max). NaN et Infinity deviennent NULL et le rapport les compte.

Les colonnes d'identité et les séquences sont-elles gardées ?

Oui. Les colonnes d'identité deviennent des colonnes IDENTITY et reprennent après l'identifiant le plus élevé ; les séquences deviennent des séquences SQL Server, et les valeurs par défaut qui puisent dans une séquence continuent d'y puiser.

Et les packages, procédures et déclencheurs PL/SQL ?

Ils sont listés par nom dans le rapport et ne sont pas convertis, car chaque base de données les écrit dans son propre langage.

Sur quelles versions de SQL Server le script se charge-t-il ?

SQL Server 2017 à 2025. Le même script se charge sur chacune, et s'arrête à la première erreur en cas de problème.