Naar de inhoud
IntoSQL-startpagina

Oracle omzetten naar SQL Server

Zet het .sql-bestand neer dat Database Export van SQL Developer of SQLcl schrijft, met zijn tabellen en Insert-statements, en download een SQL Server-script met dezelfde tabellen, sleutels, indexen en data. Elke waarde die SQL Server niet ongewijzigd kan bevatten, en elk object dat het niet overneemt, staat in het rapport.

Je bestand
sqlshop_2024_oracle.sqlVoorbeeldbestand, 9,3 kB
Je database

18 rijen geconverteerd, 2 correcties, geen afgewezen

Tonen

Tabellen in shop_2024_oracle.sqlOracle-dump · geschreven door SQL Developer · utf-8

  • customers8 rijen1
    7 kolommen
    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 rijen1
    9 kolommen
    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

Correcties

  1. "name" van customers bevat tekens die SQL Server dubbel telt, zoals emoji, dus het is nvarchar(200).
  2. "note" van orders bevat tekens die SQL Server dubbel telt, zoals emoji, dus het is nvarchar(510).

Je bestand wordt op deze computer omgezet en nooit geüpload.

Andere voorbeelden:

Wat er verandert van Oracle naar SQL Server

Elke rij is een regel die de converter toepast, met de rapportregel die hij schrijft als de regel iets in je data verandert.

  • BOOLEAN (23ai)

    bit

    SQL Server heeft geen boolean-kolom, dus TRUE en FALSE zijn 1 en 0.

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

    nvarchar(n), nchar(n) en nvarchar(max)

    Lengtes tellen tekens, of Oracle nu bytes of tekens telde, zodat elke waarde past.

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

    nvarchar(2n), of nvarchar(max) boven 4000

    nvarchar telt UTF-16-eenheden en een emoji neemt er twee, dus de kolom krijgt ruimte voor elke waarde.

    Rapportregel: text_length_widened

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

    decimal(p,s) of bigint

    NUMBER behoudt elk cijfer; een NUMBER zonder precisie waarvan alle waarden gehele getallen van hoogstens 18 cijfers zijn, wordt een 64-bits integer, en een negatieve schaal krijgt evenveel cijfers voor de komma.

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    nvarchar(100) met de tekst van Oracle, zoals +01-06

    SQL Server heeft geen interval-type; de tekst behoudt elk deel.

    Rapportregel: type_replaced

  • DATE, TIMESTAMP(p)

    datetime2(p)

    DATE in Oracle bevat een tijd tot op de seconde, dus het is een datum met tijd. Een export in een Amerikaanse of Duitse sessie schrijft datums zonder tijd of eeuw (DD-MON-RR); exporteer in een ISO-sessie (SYYYY-MM-DD HH24:MI:SS) om ze te behouden.

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    datetimeoffset, met de offset van elke waarde

    Hetzelfde type en dezelfde waarden.

  • JSON (21c), and CLOB holding JSON

    nvarchar(max)

    Dezelfde JSON-waarden; een SQL-NULL die de export als 'null' schreef, blijft NULL.

  • BLOB, RAW(n), LONG RAW

    binary(n), varbinary(n) en varbinary(max)

    Bytes blijven bytes.

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    nvarchar(max), en xml voor XMLTYPE

    De eigen typen van Oracle hebben geen equivalent; hun waarden behouden hun tekst, ROWID-waarden inbegrepen, al betekenen die buiten Oracle niets.

  • collations that ignore case (BINARY_CI)

    dezelfde collation op elke kolom

    Kolommen vergelijken en sorteren zoals voorheen, en unieke sleutels houden dezelfde rijen uit elkaar.

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

    IDENTITY, verdergaand na het hoogste id

    De gekopieerde id's laden ongewijzigd, en de teller gaat verder na het hoogste. Een kolom die een trigger vult uit een sequence (de manier van voor 12c) wordt ook een identity-kolom.

  • identity columns the target can't count

    een geheel getal zonder teller

    SQL Server telt één IDENTITY-kolom per tabel; elke andere behoudt zijn waarden zonder teller.

    Rapportregel: counter_dropped

  • CREATE SEQUENCE

    CREATE SEQUENCE met dezelfde opties

    De export schrijft hoe ver een sequence is gekomen als zijn START WITH, dus hij gaat daar verder.

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

    berekende kolommen

    SQL Server berekent ze met dezelfde formule; de waarden die de export ervoor schreef, worden weggelaten.

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

    een gewone kolom

    Een formule die niet voor SQL Server kan worden geschreven, levert een gewone kolom en een regel in het rapport op; de waarden die de export voor virtuele kolommen schreef, worden weggelaten, en SQL Server kan ze niet berekenen.

    Rapportregel: generated_not_translated

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

    geen standaardwaarde

    Een standaardwaarde die niet kan worden geschreven, wordt weggelaten en gemeld.

    Rapportregel: default_not_translated

  • CHECK constraints

    vertaald

    Dezelfde checks, getest terwijl elke rij laadt.

  • CHECK constraints with functions IntoSQL doesn't write

    niet aangemaakt

    Een check die niet kan worden geschreven, wordt weggelaten en gemeld.

    Rapportregel: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    niet aangemaakt

    Oracle past deze checks niet toe op de rijen die er al zijn, dus de rijen kunnen ze schenden.

    Rapportregel: check_not_enforced

  • function-based, bitmap and domain indexes

    niet aangemaakt

    IntoSQL schrijft b-tree-indexen op hele kolommen; maak de andere na het laden opnieuw aan.

    Rapportregel: index_skipped

  • foreign keys

    na de data, WITH NOCHECK, daarna gecontroleerd met een waarschuwing bij wezen

    De sleutel wordt na de rijen aangemaakt en als laatste gecontroleerd; rijen zonder ouder laten hem ongecontroleerd met een waarschuwing, in plaats van het laden te stoppen.

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

    NO ACTION

    SQL Server weigert cascades die een lus vormen of een tweede pad nemen, dus de sleutel wordt zonder die actie aangemaakt en het rapport noemt die.

    Rapportregel: foreign_key_action_dropped

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

    niet aangemaakt

    Een sleutel kan niet verwijzen naar een tabel die er niet is, en een sleutel die Oracle niet controleert, kan rijen zonder ouder hebben.

    Rapportregel: foreign_key_skipped

  • partitioned tables

    één tabel met de rijen van elke partitie

    De rijen zijn dezelfde; partitioneer de tabel opnieuw in SQL Server als dat nodig is.

    Rapportregel: partitions_dropped

  • NOT NULL columns with values that become NULL

    NOT NULL weggelaten

    Een kolom waarvan waarden NULL moesten worden, kan NOT NULL niet houden, anders zou het laden stoppen.

    Rapportregel: not_null_relaxed

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

    vermeld in het rapport

    Hun code is geschreven in PL/SQL, dus ze worden vermeld zodat je ze opnieuw kunt maken.

    Rapportregel: not_converted_objects

  • exports without CREATE TABLE (data only)

    typen afgeleid uit de waarden

    Een export met alleen data bevat alleen rijen, dus de typen komen uit de waarden.

    Rapportregel: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    Een converter die geen database draait, kan ze niet evalueren; to_date, to_timestamp, TO_CLOB, HEXTORAW en de andere die exports schrijven, worden gelezen.

    Rapportregel: expression_value

  • types IntoSQL doesn't know, and object types

    nvarchar(max)

    Text kan elke waarde bevatten; wijzig het type na het laden.

    Rapportregel: unknown_type

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

    NULL

    Een waarde die geen datum is, wordt NULL en het rapport telt hem.

    Rapportregel: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    NULL

    Drijvendekommatypen in SQL Server kennen geen NaN of oneindig, dus die waarden worden NULL en het rapport telt ze.

    Rapportregel: invalid_value_null

  • NUL characters in text

    behouden

    nvarchar kan een NUL-teken bevatten, dus de waarde wordt ongewijzigd gekopieerd.

  • text that isn't valid in its encoding

    de foute bytes als het vervangingsteken

    Het script is UTF-8 en elke waarde moet geldige tekst zijn.

    Rapportregel: invalid_utf8_replaced

  • text decoded twice (ñ)

    ongewijzigd gekopieerd

    Het script bevat precies deze tekens, dus ze worden gekopieerd; het rapport wijst ze aan.

    Rapportregel: mojibake_suspected

In OracleIn SQL ServerRapportregel
BOOLEAN (23ai)bitSQL Server heeft geen boolean-kolom, dus TRUE en FALSE zijn 1 en 0.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGnvarchar(n), nchar(n) en nvarchar(max)Lengtes tellen tekens, of Oracle nu bytes of tekens telde, zodat elke waarde past.
VARCHAR2 and NVARCHAR2 past what the target's own types holdnvarchar(2n), of nvarchar(max) boven 4000nvarchar telt UTF-16-eenheden en een emoji neemt er twee, dus de kolom krijgt ruimte voor elke waarde.text_length_widened
NUMBER, NUMBER(p,s), FLOAT(b)decimal(p,s) of bigintNUMBER behoudt elk cijfer; een NUMBER zonder precisie waarvan alle waarden gehele getallen van hoogstens 18 cijfers zijn, wordt een 64-bits integer, en een negatieve schaal krijgt evenveel cijfers voor de komma.
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECONDnvarchar(100) met de tekst van Oracle, zoals +01-06SQL Server heeft geen interval-type; de tekst behoudt elk deel.type_replaced
DATE, TIMESTAMP(p)datetime2(p)DATE in Oracle bevat een tijd tot op de seconde, dus het is een datum met tijd. Een export in een Amerikaanse of Duitse sessie schrijft datums zonder tijd of eeuw (DD-MON-RR); exporteer in een ISO-sessie (SYYYY-MM-DD HH24:MI:SS) om ze te behouden.
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONEdatetimeoffset, met de offset van elke waardeHetzelfde type en dezelfde waarden.
JSON (21c), and CLOB holding JSONnvarchar(max)Dezelfde JSON-waarden; een SQL-NULL die de export als 'null' schreef, blijft NULL.
BLOB, RAW(n), LONG RAWbinary(n), varbinary(n) en varbinary(max)Bytes blijven bytes.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYnvarchar(max), en xml voor XMLTYPEDe eigen typen van Oracle hebben geen equivalent; hun waarden behouden hun tekst, ROWID-waarden inbegrepen, al betekenen die buiten Oracle niets.
collations that ignore case (BINARY_CI)dezelfde collation op elke kolomKolommen vergelijken en sorteren zoals voorheen, en unieke sleutels houden dezelfde rijen uit elkaar.
identity columns, and a sequence a BEFORE INSERT trigger assignsIDENTITY, verdergaand na het hoogste idDe gekopieerde id's laden ongewijzigd, en de teller gaat verder na het hoogste. Een kolom die een trigger vult uit een sequence (de manier van voor 12c) wordt ook een identity-kolom.
identity columns the target can't counteen geheel getal zonder tellerSQL Server telt één IDENTITY-kolom per tabel; elke andere behoudt zijn waarden zonder teller.counter_dropped
CREATE SEQUENCECREATE SEQUENCE met dezelfde optiesDe export schrijft hoe ver een sequence is gekomen als zijn START WITH, dus hij gaat daar verder.
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)berekende kolommenSQL Server berekent ze met dezelfde formule; de waarden die de export ervoor schreef, worden weggelaten.
virtual columns with functions IntoSQL doesn't write, and the || operatoreen gewone kolomEen formule die niet voor SQL Server kan worden geschreven, levert een gewone kolom en een regel in het rapport op; de waarden die de export voor virtuele kolommen schreef, worden weggelaten, en SQL Server kan ze niet berekenen.generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)geen standaardwaardeEen standaardwaarde die niet kan worden geschreven, wordt weggelaten en gemeld.default_not_translated
CHECK constraintsvertaaldDezelfde checks, getest terwijl elke rij laadt.
CHECK constraints with functions IntoSQL doesn't writeniet aangemaaktEen check die niet kan worden geschreven, wordt weggelaten en gemeld.check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATEniet aangemaaktOracle past deze checks niet toe op de rijen die er al zijn, dus de rijen kunnen ze schenden.check_not_enforced
function-based, bitmap and domain indexesniet aangemaaktIntoSQL schrijft b-tree-indexen op hele kolommen; maak de andere na het laden opnieuw aan.index_skipped
foreign keysna de data, WITH NOCHECK, daarna gecontroleerd met een waarschuwing bij wezenDe sleutel wordt na de rijen aangemaakt en als laatste gecontroleerd; rijen zonder ouder laten hem ongecontroleerd met een waarschuwing, in plaats van het laden te stoppen.
ON DELETE CASCADE that cascades in a cycle or along a second pathNO ACTIONSQL Server weigert cascades die een lus vormen of een tweede pad nemen, dus de sleutel wordt zonder die actie aangemaakt en het rapport noemt die.foreign_key_action_dropped
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE onesniet aangemaaktEen sleutel kan niet verwijzen naar een tabel die er niet is, en een sleutel die Oracle niet controleert, kan rijen zonder ouder hebben.foreign_key_skipped
partitioned tableséén tabel met de rijen van elke partitieDe rijen zijn dezelfde; partitioneer de tabel opnieuw in SQL Server als dat nodig is.partitions_dropped
NOT NULL columns with values that become NULLNOT NULL weggelatenEen kolom waarvan waarden NULL moesten worden, kan NOT NULL niet houden, anders zou het laden stoppen.not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggersvermeld in het rapportHun code is geschreven in PL/SQL, dus ze worden vermeld zodat je ze opnieuw kunt maken.not_converted_objects
exports without CREATE TABLE (data only)typen afgeleid uit de waardenEen export met alleen data bevat alleen rijen, dus de typen komen uit de waarden.no_schema
expressions in INSERT values other than the ones exports writeNULLEen converter die geen database draait, kan ze niet evalueren; to_date, to_timestamp, TO_CLOB, HEXTORAW en de andere die exports schrijven, worden gelezen.expression_value
types IntoSQL doesn't know, and object typesnvarchar(max)Text kan elke waarde bevatten; wijzig het type na het laden.unknown_type
dates before year 1 and time zones given as region namesNULLEen waarde die geen datum is, wordt NULL en het rapport telt hem.date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLENULLDrijvendekommatypen in SQL Server kennen geen NaN of oneindig, dus die waarden worden NULL en het rapport telt ze.invalid_value_null
NUL characters in textbehoudennvarchar kan een NUL-teken bevatten, dus de waarde wordt ongewijzigd gekopieerd.
text that isn't valid in its encodingde foute bytes als het vervangingstekenHet script is UTF-8 en elke waarde moet geldige tekst zijn.invalid_utf8_replaced
text decoded twice (ñ)ongewijzigd gekopieerdHet script bevat precies deze tekens, dus ze worden gekopieerd; het rapport wijst ze aan.mojibake_suspected

Het script in SQL Server laden

Het script maakt de tabellen aan, kopieert de rijen en voegt daarna sleutels, indexen en refererende sleutels toe, zodat het snel laadt en bij de eerste fout stopt.

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

Refererende sleutels worden toegevoegd met WITH NOCHECK en daarna gecontroleerd. Verwijst een rij naar een rij die niet bestaat, dan vertelt het script welke constraint het is en laat het die ongecontroleerd, in plaats van halverwege te mislukken.

Voer bij een grote dump sqlcmd uit op dezelfde machine als de server. Elke batch van maximaal 1000 rijen wordt apart gecommit, zodat het transactielogboek klein blijft.

Een dump van Oracle maken voor het beste resultaat

De converter leest wat de dump bevat. Met deze opties blijft er meer van je data in staan:

  • Kies in SQL Developer Tools, Database Export, met DDL en het dataformaat Insert. SQLcl schrijft hetzelfde met SET SQLFORMAT INSERT.
  • Voer ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' uit voordat je exporteert: het standaardformaat schrijft datums zonder tijd of eeuw.
  • Een .dmp-bestand van exp of expdp is binair: importeer het in een Oracle-database, bijvoorbeeld Oracle Database Free in Docker, en exporteer het met SQL Developer.

Wat niet wordt geconverteerd

Weergaven, packages, procedures, functies, triggers, typen en synoniemen zijn geschreven in PL/SQL. Ze staan op naam in het rapport en worden nooit stilletjes weggelaten, zodat je ze kunt herschrijven voor SQL Server.

Vragen over Oracle naar SQL Server

Staat je vraag er niet bij? Schrijf ons via de contactpagina en een mens antwoordt. Contactpagina

Wordt mijn dump geüpload?

Nee. De converter draait in je browser en leest de dump in delen van je schijf, dus hij verlaat je computer nooit. De desktopapp en de opdrachtregel converteren ook op je computer.

Hoe groot mag de dump zijn?

De converter houdt nooit de hele dump in het geheugen: hij leest het bestand twee keer, in bereiken, en schrijft het script gaandeweg. Dumps van meerdere gigabytes worden geconverteerd in de browser, in de desktopapp en met de opdrachtregel.

Kan ik een .dmp-bestand van exp of expdp converteren?

Niet direct: Data Pump en de oorspronkelijke Export schrijven een binair formaat dat alleen Oracle leest. Importeer het bestand in een willekeurige Oracle-database (Oracle Database Free draait in Docker) en exporteer het met Database Export van SQL Developer of met SQLcl. De converter meldt dat wanneer hij een .dmp-bestand krijgt.

Van welke Oracle-versies kan de export komen?

Exports uit SQL Developer en SQLcl, met de tabeldefinities van DBMS_METADATA, vanaf Oracle 11g. Elke testexport komt van Oracle 21c en 23ai, in Amerikaanse, Duitse en ISO-sessies, en wordt cel voor cel met zijn bron vergeleken.

Wat gebeurt er met NUMBER, DATE en de andere Oracle-typen?

NUMBER wordt decimal, of bigint voor gehele getallen; DATE wordt datetime2(0) en behoudt zijn tijd; tekst wordt nvarchar, exact vergeleken zoals in Oracle; CLOB nvarchar(max), BLOB varbinary(max). NaN en Infinity worden NULL en het rapport telt ze.

Blijven identity-kolommen en sequences behouden?

Ja. Identity-kolommen worden IDENTITY-kolommen en gaan verder na het hoogste id; sequences worden SQL Server-sequences, en standaardwaarden die er een waarde uit halen, blijven dat doen.

En PL/SQL-packages, procedures en triggers?

Ze staan op naam in het rapport en worden niet geconverteerd, omdat elke database ze in een eigen taal schrijft.

Op welke SQL Server-versies laadt het script?

SQL Server 2017 tot en met 2025. Hetzelfde script laadt op elk ervan en stopt bij de eerste fout als er iets misgaat.