Saltar al contenido
Inicio de IntoSQL

Convierte Oracle a SQL Server

Suelta el archivo .sql que escribe Database Export de SQL Developer o SQLcl, con sus tablas y sentencias Insert, y descarga un script de SQL Server con las mismas tablas, claves, índices y datos. Cada valor que SQL Server no puede guardar tal cual, y cada objeto que no admite, aparece en el informe.

Tu archivo
sqlshop_2024_oracle.sqlArchivo de ejemplo, 9,3 kB
Tu base de datos

18 filas convertidas, 2 correcciones, ninguna rechazada

Mostrar

Tablas en shop_2024_oracle.sqlVolcado de Oracle · escrito por SQL Developer · utf-8

  • customers8 filas1
    7 columnas
    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 filas1
    9 columnas
    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

Correcciones

  1. "name" de customers contiene caracteres que SQL Server cuenta dos veces, como los emoji, así que es nvarchar(200).
  2. "note" de orders contiene caracteres que SQL Server cuenta dos veces, como los emoji, así que es nvarchar(510).

Tu archivo se convierte en esta computadora y nunca se sube.

Otros ejemplos:

Qué cambia de Oracle a SQL Server

Cada fila es una regla que aplica el convertidor, con la línea que escribe en el informe cuando la regla cambia algo en tus datos.

  • BOOLEAN (23ai)

    bit

    SQL Server no tiene columna booleana, así que TRUE y FALSE son 1 y 0.

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

    nvarchar(n), nchar(n) y nvarchar(max)

    Las longitudes cuentan caracteres, tanto si Oracle contaba bytes como caracteres, así que cada valor cabe.

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

    nvarchar(2n), o nvarchar(max) a partir de 4000

    nvarchar cuenta unidades UTF-16 y un emoji ocupa dos, así que la columna tiene espacio para cada valor.

    Línea del informe: text_length_widened

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

    decimal(p,s), o bigint

    NUMBER conserva cada dígito; un NUMBER sin precisión cuyos valores son todos números enteros de hasta 18 dígitos es un entero de 64 bits, y una escala negativa admite otros tantos dígitos antes del punto.

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    nvarchar(100) con el texto de Oracle, como +01-06

    SQL Server no tiene tipo interval; el texto conserva cada parte.

    Línea del informe: type_replaced

  • DATE, TIMESTAMP(p)

    datetime2(p)

    El DATE de Oracle guarda una hora al segundo, así que es una fecha y hora. Una exportación en una sesión estadounidense o alemana escribe las fechas sin su hora ni su siglo (DD-MON-RR); exporta en una sesión ISO (SYYYY-MM-DD HH24:MI:SS) para conservarlas.

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    datetimeoffset, con el desfase de cada valor

    El mismo tipo y los mismos valores.

  • JSON (21c), and CLOB holding JSON

    nvarchar(max)

    Los mismos valores JSON; un NULL de SQL que la exportación escribió como 'null' sigue siendo NULL.

  • BLOB, RAW(n), LONG RAW

    binary(n), varbinary(n) y varbinary(max)

    Los bytes siguen siendo bytes.

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    nvarchar(max), y xml para XMLTYPE

    Los tipos propios de Oracle no tienen equivalente; sus valores conservan su texto, incluidos los valores ROWID, aunque fuera de Oracle no signifiquen nada.

  • collations that ignore case (BINARY_CI)

    la misma intercalación en cada columna

    Las columnas comparan y ordenan como antes, y las claves únicas mantienen distintas las mismas filas.

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

    IDENTITY, siguiendo después del id más alto

    Los ids copiados se cargan tal cual, y el contador sigue después del más alto. Una columna que un disparador llena desde una secuencia (la forma anterior a 12c) también es de identidad.

  • identity columns the target can't count

    un entero simple

    SQL Server cuenta una columna IDENTITY por tabla; cualquier otra conserva sus valores sin contador.

    Línea del informe: counter_dropped

  • CREATE SEQUENCE

    CREATE SEQUENCE con las mismas opciones

    La exportación escribe hasta dónde llegó una secuencia como su START WITH, así que sigue desde ahí.

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

    columnas calculadas

    SQL Server las calcula con la misma fórmula; los valores que la exportación escribió para ellas se omiten.

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

    una columna simple

    Una fórmula que no se puede escribir para SQL Server deja una columna simple y una línea en el informe; los valores que la exportación escribió para las columnas virtuales se omiten, y SQL Server no tiene ninguno que calcular.

    Línea del informe: generated_not_translated

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

    sin valor predeterminado

    Un valor predeterminado que no se puede escribir se deja fuera y aparece en el informe.

    Línea del informe: default_not_translated

  • CHECK constraints

    traducidos

    Los mismos CHECK, comprobados al cargar cada fila.

  • CHECK constraints with functions IntoSQL doesn't write

    no se crea

    Un CHECK que no se puede escribir se deja fuera y aparece en el informe.

    Línea del informe: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    no se crea

    Oracle no aplica estos CHECK a las filas que ya estaban, así que las filas pueden no cumplirlos.

    Línea del informe: check_not_enforced

  • function-based, bitmap and domain indexes

    no se crea

    IntoSQL escribe índices b-tree sobre columnas completas; vuelve a crear los demás después de cargar.

    Línea del informe: index_skipped

  • foreign keys

    después de los datos, WITH NOCHECK, luego comprobada con una advertencia si hay huérfanas

    La clave se crea después de las filas y se comprueba al final; las filas sin padre la dejan sin comprobar con una advertencia en lugar de detener la carga.

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

    NO ACTION

    SQL Server rechaza las propagaciones que forman un ciclo o toman un segundo camino, así que la clave se crea sin esa acción y el informe la menciona.

    Línea del informe: foreign_key_action_dropped

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

    no se crea

    Una clave no puede nombrar una tabla que no existe, y una que Oracle no comprueba puede tener filas sin padre.

    Línea del informe: foreign_key_skipped

  • partitioned tables

    una tabla con las filas de todas las particiones

    Las filas son las mismas; vuelve a particionar la tabla en SQL Server si lo necesita.

    Línea del informe: partitions_dropped

  • NOT NULL columns with values that become NULL

    sin NOT NULL

    Una columna cuyos valores tuvieron que volverse NULL no puede conservar NOT NULL, o la carga se detendría.

    Línea del informe: not_null_relaxed

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

    listados en el informe

    Su código está escrito en PL/SQL, así que se listan para que los vuelvas a crear.

    Línea del informe: not_converted_objects

  • exports without CREATE TABLE (data only)

    tipos leídos de los valores

    Una exportación solo de datos solo tiene filas, así que los tipos salen de los valores.

    Línea del informe: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    Un convertidor que no ejecuta una base de datos no puede evaluarlas; sí se leen to_date, to_timestamp, TO_CLOB, HEXTORAW y las demás que escriben las exportaciones.

    Línea del informe: expression_value

  • types IntoSQL doesn't know, and object types

    nvarchar(max)

    El texto admite cualquier valor; cambia el tipo después de cargar.

    Línea del informe: unknown_type

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

    NULL

    Un valor que no es una fecha se vuelve NULL y el informe lo cuenta.

    Línea del informe: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    NULL

    Los tipos de coma flotante de SQL Server no tienen NaN ni infinito, así que esos valores se vuelven NULL y el informe los cuenta.

    Línea del informe: invalid_value_null

  • NUL characters in text

    se conserva

    nvarchar puede contener un carácter NUL, así que el valor se copia tal cual.

  • text that isn't valid in its encoding

    los bytes incorrectos como carácter de reemplazo

    El script es UTF-8 y cada valor tiene que ser texto válido.

    Línea del informe: invalid_utf8_replaced

  • text decoded twice (ñ)

    se copia tal cual

    El script contiene exactamente estos caracteres, así que se copian; el informe los señala.

    Línea del informe: mojibake_suspected

En OracleEn SQL ServerLínea del informe
BOOLEAN (23ai)bitSQL Server no tiene columna booleana, así que TRUE y FALSE son 1 y 0.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGnvarchar(n), nchar(n) y nvarchar(max)Las longitudes cuentan caracteres, tanto si Oracle contaba bytes como caracteres, así que cada valor cabe.
VARCHAR2 and NVARCHAR2 past what the target's own types holdnvarchar(2n), o nvarchar(max) a partir de 4000nvarchar cuenta unidades UTF-16 y un emoji ocupa dos, así que la columna tiene espacio para cada valor.text_length_widened
NUMBER, NUMBER(p,s), FLOAT(b)decimal(p,s), o bigintNUMBER conserva cada dígito; un NUMBER sin precisión cuyos valores son todos números enteros de hasta 18 dígitos es un entero de 64 bits, y una escala negativa admite otros tantos dígitos antes del punto.
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECONDnvarchar(100) con el texto de Oracle, como +01-06SQL Server no tiene tipo interval; el texto conserva cada parte.type_replaced
DATE, TIMESTAMP(p)datetime2(p)El DATE de Oracle guarda una hora al segundo, así que es una fecha y hora. Una exportación en una sesión estadounidense o alemana escribe las fechas sin su hora ni su siglo (DD-MON-RR); exporta en una sesión ISO (SYYYY-MM-DD HH24:MI:SS) para conservarlas.
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONEdatetimeoffset, con el desfase de cada valorEl mismo tipo y los mismos valores.
JSON (21c), and CLOB holding JSONnvarchar(max)Los mismos valores JSON; un NULL de SQL que la exportación escribió como 'null' sigue siendo NULL.
BLOB, RAW(n), LONG RAWbinary(n), varbinary(n) y varbinary(max)Los bytes siguen siendo bytes.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYnvarchar(max), y xml para XMLTYPELos tipos propios de Oracle no tienen equivalente; sus valores conservan su texto, incluidos los valores ROWID, aunque fuera de Oracle no signifiquen nada.
collations that ignore case (BINARY_CI)la misma intercalación en cada columnaLas columnas comparan y ordenan como antes, y las claves únicas mantienen distintas las mismas filas.
identity columns, and a sequence a BEFORE INSERT trigger assignsIDENTITY, siguiendo después del id más altoLos ids copiados se cargan tal cual, y el contador sigue después del más alto. Una columna que un disparador llena desde una secuencia (la forma anterior a 12c) también es de identidad.
identity columns the target can't countun entero simpleSQL Server cuenta una columna IDENTITY por tabla; cualquier otra conserva sus valores sin contador.counter_dropped
CREATE SEQUENCECREATE SEQUENCE con las mismas opcionesLa exportación escribe hasta dónde llegó una secuencia como su START WITH, así que sigue desde ahí.
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)columnas calculadasSQL Server las calcula con la misma fórmula; los valores que la exportación escribió para ellas se omiten.
virtual columns with functions IntoSQL doesn't write, and the || operatoruna columna simpleUna fórmula que no se puede escribir para SQL Server deja una columna simple y una línea en el informe; los valores que la exportación escribió para las columnas virtuales se omiten, y SQL Server no tiene ninguno que calcular.generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)sin valor predeterminadoUn valor predeterminado que no se puede escribir se deja fuera y aparece en el informe.default_not_translated
CHECK constraintstraducidosLos mismos CHECK, comprobados al cargar cada fila.
CHECK constraints with functions IntoSQL doesn't writeno se creaUn CHECK que no se puede escribir se deja fuera y aparece en el informe.check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATEno se creaOracle no aplica estos CHECK a las filas que ya estaban, así que las filas pueden no cumplirlos.check_not_enforced
function-based, bitmap and domain indexesno se creaIntoSQL escribe índices b-tree sobre columnas completas; vuelve a crear los demás después de cargar.index_skipped
foreign keysdespués de los datos, WITH NOCHECK, luego comprobada con una advertencia si hay huérfanasLa clave se crea después de las filas y se comprueba al final; las filas sin padre la dejan sin comprobar con una advertencia en lugar de detener la carga.
ON DELETE CASCADE that cascades in a cycle or along a second pathNO ACTIONSQL Server rechaza las propagaciones que forman un ciclo o toman un segundo camino, así que la clave se crea sin esa acción y el informe la menciona.foreign_key_action_dropped
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE onesno se creaUna clave no puede nombrar una tabla que no existe, y una que Oracle no comprueba puede tener filas sin padre.foreign_key_skipped
partitioned tablesuna tabla con las filas de todas las particionesLas filas son las mismas; vuelve a particionar la tabla en SQL Server si lo necesita.partitions_dropped
NOT NULL columns with values that become NULLsin NOT NULLUna columna cuyos valores tuvieron que volverse NULL no puede conservar NOT NULL, o la carga se detendría.not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggerslistados en el informeSu código está escrito en PL/SQL, así que se listan para que los vuelvas a crear.not_converted_objects
exports without CREATE TABLE (data only)tipos leídos de los valoresUna exportación solo de datos solo tiene filas, así que los tipos salen de los valores.no_schema
expressions in INSERT values other than the ones exports writeNULLUn convertidor que no ejecuta una base de datos no puede evaluarlas; sí se leen to_date, to_timestamp, TO_CLOB, HEXTORAW y las demás que escriben las exportaciones.expression_value
types IntoSQL doesn't know, and object typesnvarchar(max)El texto admite cualquier valor; cambia el tipo después de cargar.unknown_type
dates before year 1 and time zones given as region namesNULLUn valor que no es una fecha se vuelve NULL y el informe lo cuenta.date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLENULLLos tipos de coma flotante de SQL Server no tienen NaN ni infinito, así que esos valores se vuelven NULL y el informe los cuenta.invalid_value_null
NUL characters in textse conservanvarchar puede contener un carácter NUL, así que el valor se copia tal cual.
text that isn't valid in its encodinglos bytes incorrectos como carácter de reemplazoEl script es UTF-8 y cada valor tiene que ser texto válido.invalid_utf8_replaced
text decoded twice (ñ)se copia tal cualEl script contiene exactamente estos caracteres, así que se copian; el informe los señala.mojibake_suspected

Carga el script en SQL Server

El script crea las tablas, copia las filas y luego agrega claves, índices y claves foráneas, así que carga rápido y se detiene en el primer error.

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

Las claves foráneas se agregan WITH NOCHECK y luego se comprueban. Si una fila apunta a una fila que no existe, el script dice qué restricción es y la deja sin comprobar, en lugar de fallar a medias.

Para un volcado grande, ejecuta sqlcmd en la misma máquina que el servidor. Cada lote de hasta 1000 filas se confirma por separado, así que el registro de transacciones se mantiene pequeño.

Haz el volcado de Oracle para el mejor resultado

El convertidor lee lo que contiene el volcado. Estas opciones conservan más de tus datos en él:

  • En SQL Developer, elige Tools, Database Export, con DDL y el formato de datos Insert. SQLcl escribe lo mismo con SET SQLFORMAT INSERT.
  • Ejecuta ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' antes de exportar: el formato predeterminado escribe las fechas sin su hora ni su siglo.
  • Un archivo .dmp de exp o expdp es binario: impórtalo en una base de datos Oracle, por ejemplo Oracle Database Free en Docker, y expórtalo con SQL Developer.

Qué no se convierte

Las vistas, paquetes, procedimientos, funciones, disparadores, tipos y sinónimos se escriben en PL/SQL. Aparecen en el informe por nombre, nunca se descartan en silencio, para que puedas reescribirlos para SQL Server.

Preguntas sobre Oracle a SQL Server

¿No encuentras la respuesta? Escríbenos desde la página de contacto y te responde una persona. Página de contacto

¿Se sube mi volcado?

No. El convertidor se ejecuta en tu navegador y lee el volcado de tu disco por partes, así que nunca sale de tu computadora. La app de escritorio y la línea de comandos también convierten en tu computadora.

¿Qué tan grande puede ser el volcado?

El convertidor nunca tiene todo el volcado en memoria: lee el archivo dos veces, por rangos, y escribe el script sobre la marcha. Los volcados de varios gigabytes se convierten en el navegador, en la app de escritorio y con la línea de comandos.

¿Puedo convertir un archivo .dmp de exp o expdp?

No directamente: Data Pump y el Export original escriben un formato binario que solo Oracle lee. Impórtalo en cualquier base de datos Oracle, Oracle Database Free funciona en Docker, y expórtalo con Database Export de SQL Developer o con SQLcl. El convertidor te lo indica cuando recibe un archivo .dmp.

¿De qué versiones de Oracle puede venir la exportación?

Exportaciones de SQL Developer y SQLcl, con las definiciones de tabla de DBMS_METADATA, desde Oracle 11g en adelante. Cada exportación de prueba viene de Oracle 21c y 23ai, en sesiones estadounidenses, alemanas e ISO, y se compara con su origen celda por celda.

¿Qué pasa con NUMBER, DATE y los demás tipos de Oracle?

NUMBER se vuelve decimal, o bigint para números enteros; DATE se vuelve datetime2(0), conservando su hora; el texto nvarchar, comparado exactamente como en Oracle; CLOB nvarchar(max), BLOB varbinary(max). NaN e Infinity se vuelven NULL y el informe los cuenta.

¿Se conservan las columnas de identidad y las secuencias?

Sí. Las columnas de identidad se vuelven columnas IDENTITY y siguen después del id más alto; las secuencias se vuelven secuencias de SQL Server, y los valores predeterminados que usan una la siguen usando.

¿Qué pasa con los paquetes, procedimientos y disparadores de PL/SQL?

Aparecen en el informe por nombre y no se convierten, porque cada base de datos los escribe en su propio lenguaje.

¿En qué versiones de SQL Server carga el script?

SQL Server 2017 a 2025. El mismo script carga en cada una, y se detiene en el primer error si algo sale mal.