Vai al contenuto
Home di IntoSQL

Converti Oracle in SQL Server

Trascina il file .sql che scrive Database Export di SQL Developer o SQLcl, con le sue tabelle e istruzioni Insert, e scarica uno script per SQL Server con le stesse tabelle, chiavi, indici e dati. Ogni valore che SQL Server non può contenere così com'è, e ogni oggetto che non supporta, è elencato nel report.

Il tuo file
sqlshop_2024_oracle.sqlFile di esempio, 9,3 kB
Il tuo database

18 righe convertite, 2 correzioni, nessuna rifiutata

Mostra

Tabelle in shop_2024_oracle.sqlDump Oracle · scritto da SQL Developer · utf-8

  • customers8 righe1
    7 colonne
    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 righe1
    9 colonne
    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

Correzioni

  1. "name" di customers contiene caratteri che SQL Server conta due volte, come le emoji, quindi è nvarchar(200).
  2. "note" di orders contiene caratteri che SQL Server conta due volte, come le emoji, quindi è nvarchar(510).

Il tuo file viene convertito su questo computer e non viene mai caricato.

Altri esempi:

Cosa cambia da Oracle a SQL Server

Ogni riga è una regola che il convertitore applica, con la riga del report che scrive quando la regola cambia qualcosa nei tuoi dati.

  • BOOLEAN (23ai)

    bit

    SQL Server non ha una colonna booleana, quindi TRUE e FALSE sono 1 e 0.

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

    nvarchar(n), nchar(n) e nvarchar(max)

    Le lunghezze contano i caratteri, sia che Oracle contasse byte sia caratteri, quindi ogni valore ci sta.

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

    nvarchar(2n), o nvarchar(max) oltre 4000

    nvarchar conta unità UTF-16 e un'emoji ne occupa due, quindi la colonna ha spazio per ogni valore.

    Riga del report: text_length_widened

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

    decimal(p,s), o bigint

    NUMBER mantiene ogni cifra; un NUMBER senza precisione i cui valori sono tutti numeri interi fino a 18 cifre è un intero a 64 bit, e una scala negativa contiene altrettante cifre prima della virgola.

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    nvarchar(100) con il testo di Oracle, come +01-06

    SQL Server non ha un tipo interval; il testo mantiene ogni parte.

    Riga del report: type_replaced

  • DATE, TIMESTAMP(p)

    datetime2(p)

    Il DATE di Oracle contiene un'ora al secondo, quindi è una data e ora. Un export in una sessione americana o tedesca scrive le date senza ora né secolo (DD-MON-RR); esporta in una sessione ISO (SYYYY-MM-DD HH24:MI:SS) per mantenerle.

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    datetimeoffset, con l'offset di ogni valore

    Lo stesso tipo e gli stessi valori.

  • JSON (21c), and CLOB holding JSON

    nvarchar(max)

    Gli stessi valori JSON; un NULL SQL che l'export ha scritto come 'null' resta NULL.

  • BLOB, RAW(n), LONG RAW

    binary(n), varbinary(n) e varbinary(max)

    I byte restano byte.

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    nvarchar(max), e xml per XMLTYPE

    I tipi propri di Oracle non hanno un equivalente; i loro valori mantengono il testo, valori ROWID inclusi, anche se fuori da Oracle non significano nulla.

  • collations that ignore case (BINARY_CI)

    la stessa collation su ogni colonna

    Le colonne confrontano e ordinano come prima, e le chiavi univoche separano le stesse righe.

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

    IDENTITY, che riparte dopo l'id più alto

    Gli id copiati si caricano così come sono, e il contatore riparte dopo il più alto. Anche una colonna che un trigger riempie da una sequenza (il metodo prima della 12c) è una identity.

  • identity columns the target can't count

    un intero semplice

    SQL Server conta una colonna IDENTITY per tabella; ogni altra mantiene i suoi valori senza contatore.

    Riga del report: counter_dropped

  • CREATE SEQUENCE

    CREATE SEQUENCE con le stesse opzioni

    L'export scrive fin dove è arrivata una sequenza come suo START WITH, quindi riparte da lì.

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

    colonne calcolate

    SQL Server le calcola con la stessa formula; i valori che l'export ha scritto per loro vengono omessi.

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

    una colonna semplice

    Una formula che non si può scrivere per SQL Server lascia una colonna semplice e una riga nel report; i valori che l'export ha scritto per le colonne virtuali vengono omessi, e SQL Server non ne ha nessuno da calcolare.

    Riga del report: generated_not_translated

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

    nessun valore predefinito

    Un valore predefinito che non si può scrivere viene omesso e segnalato.

    Riga del report: default_not_translated

  • CHECK constraints

    tradotti

    Gli stessi CHECK, verificati mentre ogni riga si carica.

  • CHECK constraints with functions IntoSQL doesn't write

    non creato

    Un vincolo CHECK che non si può scrivere viene omesso e segnalato.

    Riga del report: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    non creato

    Oracle non applica questi vincoli CHECK alle righe già presenti, quindi le righe potrebbero violarli.

    Riga del report: check_not_enforced

  • function-based, bitmap and domain indexes

    non creato

    IntoSQL scrive indici b-tree su colonne intere; ricrea gli altri dopo il caricamento.

    Riga del report: index_skipped

  • foreign keys

    dopo i dati WITH NOCHECK, poi controllata con un avviso sulle righe orfane

    La chiave viene creata dopo le righe e controllata alla fine; righe senza padre la lasciano non controllata con un avviso invece di fermare il caricamento.

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

    NO ACTION

    SQL Server rifiuta le cascate che formano un ciclo o prendono un secondo percorso, quindi la chiave viene creata senza quell'azione e il report la indica.

    Riga del report: foreign_key_action_dropped

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

    non creato

    Una chiave non può riferirsi a una tabella che non c'è, e una che Oracle non verifica può avere righe senza padre.

    Riga del report: foreign_key_skipped

  • partitioned tables

    una tabella con le righe di ogni partizione

    Le righe sono le stesse; partiziona di nuovo la tabella in SQL Server se serve.

    Riga del report: partitions_dropped

  • NOT NULL columns with values that become NULL

    NOT NULL rimosso

    Una colonna i cui valori sono dovuti diventare NULL non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe.

    Riga del report: not_null_relaxed

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

    elencati nel report

    Il loro codice è scritto in PL/SQL, quindi vengono elencati perché tu li ricrei.

    Riga del report: not_converted_objects

  • exports without CREATE TABLE (data only)

    tipi ricavati dai valori

    Un export di soli dati contiene solo righe, quindi i tipi vengono ricavati dai valori.

    Riga del report: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    Un convertitore che non esegue un database non può valutarle; to_date, to_timestamp, TO_CLOB, HEXTORAW e le altre che scrivono gli export vengono lette.

    Riga del report: expression_value

  • types IntoSQL doesn't know, and object types

    nvarchar(max)

    Il testo contiene qualsiasi valore; cambia il tipo dopo il caricamento.

    Riga del report: unknown_type

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

    NULL

    Un valore che non è una data diventa NULL e il report lo conta.

    Riga del report: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    NULL

    I tipi a virgola mobile di SQL Server non hanno NaN né infinito, quindi quei valori diventano NULL e il report li conta.

    Riga del report: invalid_value_null

  • NUL characters in text

    mantenuto

    nvarchar può contenere un carattere NUL, quindi il valore viene copiato così com'è.

  • text that isn't valid in its encoding

    i byte errati come carattere di sostituzione

    Lo script è UTF-8 e ogni valore deve essere testo valido.

    Riga del report: invalid_utf8_replaced

  • text decoded twice (ñ)

    copiato così com'è

    Lo script contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala.

    Riga del report: mojibake_suspected

In OracleIn SQL ServerRiga del report
BOOLEAN (23ai)bitSQL Server non ha una colonna booleana, quindi TRUE e FALSE sono 1 e 0.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGnvarchar(n), nchar(n) e nvarchar(max)Le lunghezze contano i caratteri, sia che Oracle contasse byte sia caratteri, quindi ogni valore ci sta.
VARCHAR2 and NVARCHAR2 past what the target's own types holdnvarchar(2n), o nvarchar(max) oltre 4000nvarchar conta unità UTF-16 e un'emoji ne occupa due, quindi la colonna ha spazio per ogni valore.text_length_widened
NUMBER, NUMBER(p,s), FLOAT(b)decimal(p,s), o bigintNUMBER mantiene ogni cifra; un NUMBER senza precisione i cui valori sono tutti numeri interi fino a 18 cifre è un intero a 64 bit, e una scala negativa contiene altrettante cifre prima della virgola.
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECONDnvarchar(100) con il testo di Oracle, come +01-06SQL Server non ha un tipo interval; il testo mantiene ogni parte.type_replaced
DATE, TIMESTAMP(p)datetime2(p)Il DATE di Oracle contiene un'ora al secondo, quindi è una data e ora. Un export in una sessione americana o tedesca scrive le date senza ora né secolo (DD-MON-RR); esporta in una sessione ISO (SYYYY-MM-DD HH24:MI:SS) per mantenerle.
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONEdatetimeoffset, con l'offset di ogni valoreLo stesso tipo e gli stessi valori.
JSON (21c), and CLOB holding JSONnvarchar(max)Gli stessi valori JSON; un NULL SQL che l'export ha scritto come 'null' resta NULL.
BLOB, RAW(n), LONG RAWbinary(n), varbinary(n) e varbinary(max)I byte restano byte.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYnvarchar(max), e xml per XMLTYPEI tipi propri di Oracle non hanno un equivalente; i loro valori mantengono il testo, valori ROWID inclusi, anche se fuori da Oracle non significano nulla.
collations that ignore case (BINARY_CI)la stessa collation su ogni colonnaLe colonne confrontano e ordinano come prima, e le chiavi univoche separano le stesse righe.
identity columns, and a sequence a BEFORE INSERT trigger assignsIDENTITY, che riparte dopo l'id più altoGli id copiati si caricano così come sono, e il contatore riparte dopo il più alto. Anche una colonna che un trigger riempie da una sequenza (il metodo prima della 12c) è una identity.
identity columns the target can't countun intero sempliceSQL Server conta una colonna IDENTITY per tabella; ogni altra mantiene i suoi valori senza contatore.counter_dropped
CREATE SEQUENCECREATE SEQUENCE con le stesse opzioniL'export scrive fin dove è arrivata una sequenza come suo START WITH, quindi riparte da lì.
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)colonne calcolateSQL Server le calcola con la stessa formula; i valori che l'export ha scritto per loro vengono omessi.
virtual columns with functions IntoSQL doesn't write, and the || operatoruna colonna sempliceUna formula che non si può scrivere per SQL Server lascia una colonna semplice e una riga nel report; i valori che l'export ha scritto per le colonne virtuali vengono omessi, e SQL Server non ne ha nessuno da calcolare.generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)nessun valore predefinitoUn valore predefinito che non si può scrivere viene omesso e segnalato.default_not_translated
CHECK constraintstradottiGli stessi CHECK, verificati mentre ogni riga si carica.
CHECK constraints with functions IntoSQL doesn't writenon creatoUn vincolo CHECK che non si può scrivere viene omesso e segnalato.check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATEnon creatoOracle non applica questi vincoli CHECK alle righe già presenti, quindi le righe potrebbero violarli.check_not_enforced
function-based, bitmap and domain indexesnon creatoIntoSQL scrive indici b-tree su colonne intere; ricrea gli altri dopo il caricamento.index_skipped
foreign keysdopo i dati WITH NOCHECK, poi controllata con un avviso sulle righe orfaneLa chiave viene creata dopo le righe e controllata alla fine; righe senza padre la lasciano non controllata con un avviso invece di fermare il caricamento.
ON DELETE CASCADE that cascades in a cycle or along a second pathNO ACTIONSQL Server rifiuta le cascate che formano un ciclo o prendono un secondo percorso, quindi la chiave viene creata senza quell'azione e il report la indica.foreign_key_action_dropped
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE onesnon creatoUna chiave non può riferirsi a una tabella che non c'è, e una che Oracle non verifica può avere righe senza padre.foreign_key_skipped
partitioned tablesuna tabella con le righe di ogni partizioneLe righe sono le stesse; partiziona di nuovo la tabella in SQL Server se serve.partitions_dropped
NOT NULL columns with values that become NULLNOT NULL rimossoUna colonna i cui valori sono dovuti diventare NULL non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe.not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggerselencati nel reportIl loro codice è scritto in PL/SQL, quindi vengono elencati perché tu li ricrei.not_converted_objects
exports without CREATE TABLE (data only)tipi ricavati dai valoriUn export di soli dati contiene solo righe, quindi i tipi vengono ricavati dai valori.no_schema
expressions in INSERT values other than the ones exports writeNULLUn convertitore che non esegue un database non può valutarle; to_date, to_timestamp, TO_CLOB, HEXTORAW e le altre che scrivono gli export vengono lette.expression_value
types IntoSQL doesn't know, and object typesnvarchar(max)Il testo contiene qualsiasi valore; cambia il tipo dopo il caricamento.unknown_type
dates before year 1 and time zones given as region namesNULLUn valore che non è una data diventa NULL e il report lo conta.date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLENULLI tipi a virgola mobile di SQL Server non hanno NaN né infinito, quindi quei valori diventano NULL e il report li conta.invalid_value_null
NUL characters in textmantenutonvarchar può contenere un carattere NUL, quindi il valore viene copiato così com'è.
text that isn't valid in its encodingi byte errati come carattere di sostituzioneLo script è UTF-8 e ogni valore deve essere testo valido.invalid_utf8_replaced
text decoded twice (ñ)copiato così com'èLo script contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala.mojibake_suspected

Carica lo script in SQL Server

Lo script crea le tabelle, copia le righe, poi aggiunge chiavi, indici e chiavi esterne, così si carica in fretta e si ferma al primo errore.

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

Le chiavi esterne vengono aggiunte WITH NOCHECK e poi controllate. Se una riga punta a una riga che non esiste, lo script dice quale vincolo e lo lascia non controllato, invece di fallire a metà.

Per un dump grande, esegui sqlcmd sulla stessa macchina del server. Ogni lotto di massimo 1000 righe fa il commit da solo, così il log delle transazioni resta piccolo.

Fai il dump di Oracle per il miglior risultato

Il convertitore legge ciò che il dump contiene. Con queste opzioni il dump conserva più dei tuoi dati:

  • In SQL Developer, scegli Tools, Database Export, con DDL e il formato dati Insert. SQLcl scrive lo stesso con SET SQLFORMAT INSERT.
  • Esegui ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' prima di esportare: il formato di default scrive le date senza ora né secolo.
  • Un file .dmp di exp o expdp è binario: importalo in un database Oracle, per esempio Oracle Database Free in Docker, ed esportalo con SQL Developer.

Cosa non viene convertito

Viste, package, procedure, funzioni, trigger, tipi e sinonimi sono scritti in PL/SQL. Sono elencati per nome nel report, mai rimossi in silenzio, così puoi riscriverli per SQL Server.

Domande sulla conversione da Oracle a SQL Server

Non trovi la risposta? Scrivici dalla pagina dei contatti e ti risponde una persona. Pagina dei contatti

Il mio dump viene caricato?

No. Il convertitore funziona nel tuo browser e legge il dump dal tuo disco a pezzi, quindi non lascia mai il tuo computer. Anche l'app desktop e la riga di comando convertono sul tuo computer.

Quanto può essere grande il dump?

Il convertitore non tiene mai l'intero dump in memoria: legge il file due volte, per intervalli, e scrive lo script man mano. I dump di più gigabyte si convertono nel browser, nell'app desktop e con la riga di comando.

Posso convertire un file .dmp di exp o expdp?

Non direttamente: Data Pump e l'Export originale scrivono un formato binario che legge solo Oracle. Importalo in un qualsiasi database Oracle, Oracle Database Free gira in Docker, ed esportalo con Database Export di SQL Developer o con SQLcl. Il convertitore lo segnala quando riceve un file .dmp.

Da quali versioni di Oracle può provenire l'export?

Export di SQL Developer e SQLcl, con le definizioni di tabella di DBMS_METADATA, da Oracle 11g in poi. Ogni export di test viene da Oracle 21c e 23ai, in sessioni americane, tedesche e ISO, ed è confrontato con la sorgente cella per cella.

Cosa succede a NUMBER, DATE e agli altri tipi di Oracle?

NUMBER diventa decimal, o bigint per i numeri interi; DATE diventa datetime2(0), mantenendo l'ora; il testo nvarchar, confrontato in modo esatto come in Oracle; CLOB nvarchar(max), BLOB varbinary(max). NaN e Infinity diventano NULL e il report li conta.

Le colonne identity e le sequenze vengono mantenute?

Sì. Le colonne identity diventano colonne IDENTITY e ripartono dopo l'id più alto; le sequenze diventano sequenze di SQL Server, e i valori di default che ne usano una continuano a usarla.

E package, procedure e trigger PL/SQL?

Sono elencati per nome nel report e non vengono convertiti, perché ogni database li scrive nel proprio linguaggio.

Su quali versioni di SQL Server si carica lo script?

SQL Server dalla 2017 alla 2025. Lo stesso script si carica su ognuna, fermandosi al primo errore se qualcosa va storto.