Przejdź do treści
Strona główna IntoSQL

Konwertuj Oracle do SQL Server

Upuść plik .sql zapisany przez Database Export w SQL Developer lub przez SQLcl, z tabelami i instrukcjami Insert, i pobierz skrypt SQL Server z tymi samymi tabelami, kluczami, indeksami i danymi. Każda wartość, której SQL Server nie może przechować bez zmian, i każdy obiekt, którego nie przenosi, są wymienione w raporcie.

Twój plik
sqlshop_2024_oracle.sqlPlik przykładowy, 9,3 kB
Twoja baza danych

18 wierszy przekonwertowanych, 2 poprawki, brak odrzuconych

Pokaż

Tabele w pliku shop_2024_oracle.sqlZrzut Oracle · zapisany przez SQL Developer · utf-8

  • customers8 wierszy1
    7 kolumn
    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 wierszy1
    9 kolumn
    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

Poprawki

  1. "name" w tabeli customers zawiera znaki, które SQL Server liczy podwójnie, np. emoji, więc ma typ nvarchar(200).
  2. "note" w tabeli orders zawiera znaki, które SQL Server liczy podwójnie, np. emoji, więc ma typ nvarchar(510).

Plik jest konwertowany na tym komputerze i nigdy nie jest wysyłany.

Inne przykłady:

Co zmienia się między Oracle a SQL Server

Każdy wiersz to reguła stosowana przez konwerter, z wpisem, który dodaje do raportu, gdy reguła coś zmienia w twoich danych.

  • BOOLEAN (23ai)

    bit

    SQL Server nie ma kolumny logicznej, więc TRUE i FALSE to 1 i 0.

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

    nvarchar(n), nchar(n) i nvarchar(max)

    Długości liczą znaki, niezależnie od tego, czy Oracle liczył bajty, czy znaki, więc każda wartość się mieści.

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

    nvarchar(2n) lub nvarchar(max) powyżej 4000

    nvarchar liczy jednostki UTF-16, a emoji zajmuje dwie, więc kolumna dostaje miejsce na każdą wartość.

    Wpis w raporcie: text_length_widened

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

    decimal(p,s) lub bigint

    NUMBER zachowuje każdą cyfrę; NUMBER bez precyzji, którego wszystkie wartości są liczbami całkowitymi do 18 cyfr, staje się 64-bitową liczbą całkowitą, a ujemna skala mieści tyle samo cyfr przed przecinkiem.

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    nvarchar(100) z tekstem Oracle, np. +01-06

    SQL Server nie ma typu interval; tekst zachowuje każdą część.

    Wpis w raporcie: type_replaced

  • DATE, TIMESTAMP(p)

    datetime2(p)

    DATE w Oracle przechowuje czas z dokładnością do sekundy, więc jest datą z godziną. Eksport w sesji amerykańskiej lub niemieckiej zapisuje daty bez godziny i stulecia (DD-MON-RR); eksportuj w sesji ISO (SYYYY-MM-DD HH24:MI:SS), aby je zachować.

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    datetimeoffset z przesunięciem każdej wartości

    Ten sam typ i te same wartości.

  • JSON (21c), and CLOB holding JSON

    nvarchar(max)

    Te same wartości JSON; SQL NULL zapisany przez eksport jako 'null' pozostaje NULL.

  • BLOB, RAW(n), LONG RAW

    binary(n), varbinary(n) i varbinary(max)

    Bajty pozostają bajtami.

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    nvarchar(max) oraz xml dla XMLTYPE

    Własne typy Oracle nie mają odpowiednika; ich wartości zachowują swój tekst, łącznie z wartościami ROWID, choć poza Oracle nic nie znaczą.

  • collations that ignore case (BINARY_CI)

    to samo porównywanie w każdej kolumnie

    Kolumny porównują i sortują tak jak wcześniej, a klucze unikalne rozróżniają te same wiersze.

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

    IDENTITY, kontynuowane po najwyższym id

    Skopiowane id ładują się bez zmian, a licznik idzie dalej od najwyższego z nich. Kolumna, którą wyzwalacz wypełnia z sekwencji (sposób sprzed 12c), też staje się kolumną identity.

  • identity columns the target can't count

    zwykła liczba całkowita

    SQL Server liczy jedną kolumnę IDENTITY na tabelę; każda inna zachowuje wartości bez licznika.

    Wpis w raporcie: counter_dropped

  • CREATE SEQUENCE

    CREATE SEQUENCE z tymi samymi opcjami

    Eksport zapisuje, dokąd doszła sekwencja, jako jej START WITH, więc kontynuuje ona od tego miejsca.

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

    kolumny obliczane

    SQL Server oblicza je według tej samej formuły; wartości, które eksport dla nich zapisał, są pomijane.

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

    zwykła kolumna

    Formuła, której nie da się zapisać dla SQL Server, zostawia zwykłą kolumnę i wpis w raporcie; wartości, które eksport zapisał dla kolumn wirtualnych, są pomijane, a SQL Server nie może ich obliczyć.

    Wpis w raporcie: generated_not_translated

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

    brak wartości domyślnej

    Wartość domyślna, której nie da się zapisać, jest pomijana i zgłaszana w raporcie.

    Wpis w raporcie: default_not_translated

  • CHECK constraints

    przetłumaczone

    Te same ograniczenia CHECK, sprawdzane przy ładowaniu każdego wiersza.

  • CHECK constraints with functions IntoSQL doesn't write

    nie jest tworzone

    Ograniczenie CHECK, którego nie da się zapisać, jest pomijane i zgłaszane w raporcie.

    Wpis w raporcie: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    nie jest tworzone

    Oracle nie stosuje tych ograniczeń CHECK do już istniejących wierszy, więc wiersze mogą je łamać.

    Wpis w raporcie: check_not_enforced

  • function-based, bitmap and domain indexes

    nie jest tworzone

    IntoSQL zapisuje indeksy b-tree na całych kolumnach; pozostałe utwórz ponownie po załadowaniu.

    Wpis w raporcie: index_skipped

  • foreign keys

    po danych z WITH NOCHECK, potem sprawdzany z ostrzeżeniem o osieroconych wierszach

    Klucz jest tworzony po wierszach i sprawdzany na końcu; wiersze bez rodzica zostawiają go niesprawdzonym z ostrzeżeniem, zamiast zatrzymać ładowanie.

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

    NO ACTION

    SQL Server odrzuca kaskady, które tworzą pętlę lub idą drugą ścieżką, więc klucz jest tworzony bez tej akcji, a raport ją wymienia.

    Wpis w raporcie: foreign_key_action_dropped

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

    nie jest tworzone

    Klucz nie może wskazywać tabeli, której nie ma, a klucz, którego Oracle nie sprawdza, może mieć wiersze bez rodzica.

    Wpis w raporcie: foreign_key_skipped

  • partitioned tables

    jedna tabela z wierszami wszystkich partycji

    Wiersze są te same; jeśli trzeba, podziel tabelę na partycje ponownie w SQL Server.

    Wpis w raporcie: partitions_dropped

  • NOT NULL columns with values that become NULL

    NOT NULL usunięte

    Kolumna, której wartości musiały stać się NULL, nie może zachować NOT NULL, bo ładowanie by się zatrzymało.

    Wpis w raporcie: not_null_relaxed

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

    wymienione w raporcie

    Ich kod jest napisany w PL/SQL, więc trafiają na listę do ręcznego odtworzenia.

    Wpis w raporcie: not_converted_objects

  • exports without CREATE TABLE (data only)

    typy odczytane z wartości

    Eksport samych danych zawiera tylko wiersze, więc typy pochodzą z wartości.

    Wpis w raporcie: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    Konwerter, który nie uruchamia bazy danych, nie może ich obliczyć; to_date, to_timestamp, TO_CLOB, HEXTORAW i inne, które zapisują eksporty, są odczytywane.

    Wpis w raporcie: expression_value

  • types IntoSQL doesn't know, and object types

    nvarchar(max)

    Tekst mieści każdą wartość; zmień typ po załadowaniu.

    Wpis w raporcie: unknown_type

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

    NULL

    Wartość, która nie jest datą, staje się NULL, a raport ją liczy.

    Wpis w raporcie: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    NULL

    Typy zmiennoprzecinkowe w SQL Server nie mają NaN ani nieskończoności, więc te wartości stają się NULL, a raport je liczy.

    Wpis w raporcie: invalid_value_null

  • NUL characters in text

    zachowane

    nvarchar może zawierać znak NUL, więc wartość jest kopiowana bez zmian.

  • text that isn't valid in its encoding

    błędne bajty jako znak zastępczy

    Skrypt jest w UTF-8 i każda wartość musi być poprawnym tekstem.

    Wpis w raporcie: invalid_utf8_replaced

  • text decoded twice (ñ)

    skopiowane bez zmian

    Skrypt zawiera dokładnie te znaki, więc są kopiowane; raport je wskazuje.

    Wpis w raporcie: mojibake_suspected

W OracleW SQL ServerWpis w raporcie
BOOLEAN (23ai)bitSQL Server nie ma kolumny logicznej, więc TRUE i FALSE to 1 i 0.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGnvarchar(n), nchar(n) i nvarchar(max)Długości liczą znaki, niezależnie od tego, czy Oracle liczył bajty, czy znaki, więc każda wartość się mieści.
VARCHAR2 and NVARCHAR2 past what the target's own types holdnvarchar(2n) lub nvarchar(max) powyżej 4000nvarchar liczy jednostki UTF-16, a emoji zajmuje dwie, więc kolumna dostaje miejsce na każdą wartość.text_length_widened
NUMBER, NUMBER(p,s), FLOAT(b)decimal(p,s) lub bigintNUMBER zachowuje każdą cyfrę; NUMBER bez precyzji, którego wszystkie wartości są liczbami całkowitymi do 18 cyfr, staje się 64-bitową liczbą całkowitą, a ujemna skala mieści tyle samo cyfr przed przecinkiem.
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECONDnvarchar(100) z tekstem Oracle, np. +01-06SQL Server nie ma typu interval; tekst zachowuje każdą część.type_replaced
DATE, TIMESTAMP(p)datetime2(p)DATE w Oracle przechowuje czas z dokładnością do sekundy, więc jest datą z godziną. Eksport w sesji amerykańskiej lub niemieckiej zapisuje daty bez godziny i stulecia (DD-MON-RR); eksportuj w sesji ISO (SYYYY-MM-DD HH24:MI:SS), aby je zachować.
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONEdatetimeoffset z przesunięciem każdej wartościTen sam typ i te same wartości.
JSON (21c), and CLOB holding JSONnvarchar(max)Te same wartości JSON; SQL NULL zapisany przez eksport jako 'null' pozostaje NULL.
BLOB, RAW(n), LONG RAWbinary(n), varbinary(n) i varbinary(max)Bajty pozostają bajtami.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYnvarchar(max) oraz xml dla XMLTYPEWłasne typy Oracle nie mają odpowiednika; ich wartości zachowują swój tekst, łącznie z wartościami ROWID, choć poza Oracle nic nie znaczą.
collations that ignore case (BINARY_CI)to samo porównywanie w każdej kolumnieKolumny porównują i sortują tak jak wcześniej, a klucze unikalne rozróżniają te same wiersze.
identity columns, and a sequence a BEFORE INSERT trigger assignsIDENTITY, kontynuowane po najwyższym idSkopiowane id ładują się bez zmian, a licznik idzie dalej od najwyższego z nich. Kolumna, którą wyzwalacz wypełnia z sekwencji (sposób sprzed 12c), też staje się kolumną identity.
identity columns the target can't countzwykła liczba całkowitaSQL Server liczy jedną kolumnę IDENTITY na tabelę; każda inna zachowuje wartości bez licznika.counter_dropped
CREATE SEQUENCECREATE SEQUENCE z tymi samymi opcjamiEksport zapisuje, dokąd doszła sekwencja, jako jej START WITH, więc kontynuuje ona od tego miejsca.
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)kolumny obliczaneSQL Server oblicza je według tej samej formuły; wartości, które eksport dla nich zapisał, są pomijane.
virtual columns with functions IntoSQL doesn't write, and the || operatorzwykła kolumnaFormuła, której nie da się zapisać dla SQL Server, zostawia zwykłą kolumnę i wpis w raporcie; wartości, które eksport zapisał dla kolumn wirtualnych, są pomijane, a SQL Server nie może ich obliczyć.generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)brak wartości domyślnejWartość domyślna, której nie da się zapisać, jest pomijana i zgłaszana w raporcie.default_not_translated
CHECK constraintsprzetłumaczoneTe same ograniczenia CHECK, sprawdzane przy ładowaniu każdego wiersza.
CHECK constraints with functions IntoSQL doesn't writenie jest tworzoneOgraniczenie CHECK, którego nie da się zapisać, jest pomijane i zgłaszane w raporcie.check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATEnie jest tworzoneOracle nie stosuje tych ograniczeń CHECK do już istniejących wierszy, więc wiersze mogą je łamać.check_not_enforced
function-based, bitmap and domain indexesnie jest tworzoneIntoSQL zapisuje indeksy b-tree na całych kolumnach; pozostałe utwórz ponownie po załadowaniu.index_skipped
foreign keyspo danych z WITH NOCHECK, potem sprawdzany z ostrzeżeniem o osieroconych wierszachKlucz jest tworzony po wierszach i sprawdzany na końcu; wiersze bez rodzica zostawiają go niesprawdzonym z ostrzeżeniem, zamiast zatrzymać ładowanie.
ON DELETE CASCADE that cascades in a cycle or along a second pathNO ACTIONSQL Server odrzuca kaskady, które tworzą pętlę lub idą drugą ścieżką, więc klucz jest tworzony bez tej akcji, a raport ją wymienia.foreign_key_action_dropped
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE onesnie jest tworzoneKlucz nie może wskazywać tabeli, której nie ma, a klucz, którego Oracle nie sprawdza, może mieć wiersze bez rodzica.foreign_key_skipped
partitioned tablesjedna tabela z wierszami wszystkich partycjiWiersze są te same; jeśli trzeba, podziel tabelę na partycje ponownie w SQL Server.partitions_dropped
NOT NULL columns with values that become NULLNOT NULL usunięteKolumna, której wartości musiały stać się NULL, nie może zachować NOT NULL, bo ładowanie by się zatrzymało.not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggerswymienione w raporcieIch kod jest napisany w PL/SQL, więc trafiają na listę do ręcznego odtworzenia.not_converted_objects
exports without CREATE TABLE (data only)typy odczytane z wartościEksport samych danych zawiera tylko wiersze, więc typy pochodzą z wartości.no_schema
expressions in INSERT values other than the ones exports writeNULLKonwerter, który nie uruchamia bazy danych, nie może ich obliczyć; to_date, to_timestamp, TO_CLOB, HEXTORAW i inne, które zapisują eksporty, są odczytywane.expression_value
types IntoSQL doesn't know, and object typesnvarchar(max)Tekst mieści każdą wartość; zmień typ po załadowaniu.unknown_type
dates before year 1 and time zones given as region namesNULLWartość, która nie jest datą, staje się NULL, a raport ją liczy.date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLENULLTypy zmiennoprzecinkowe w SQL Server nie mają NaN ani nieskończoności, więc te wartości stają się NULL, a raport je liczy.invalid_value_null
NUL characters in textzachowanenvarchar może zawierać znak NUL, więc wartość jest kopiowana bez zmian.
text that isn't valid in its encodingbłędne bajty jako znak zastępczySkrypt jest w UTF-8 i każda wartość musi być poprawnym tekstem.invalid_utf8_replaced
text decoded twice (ñ)skopiowane bez zmianSkrypt zawiera dokładnie te znaki, więc są kopiowane; raport je wskazuje.mojibake_suspected

Załaduj skrypt do SQL Server

Skrypt tworzy tabele, kopiuje wiersze, a potem dodaje klucze, indeksy i klucze obce, więc ładuje się szybko i zatrzymuje przy pierwszym błędzie.

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

Klucze obce są dodawane z WITH NOCHECK, a potem sprawdzane. Jeśli wiersz wskazuje na nieistniejący wiersz, skrypt podaje, którego ograniczenia to dotyczy, i zostawia je niesprawdzone, zamiast przerwać w połowie.

Przy dużym zrzucie uruchom sqlcmd na tej samej maszynie co serwer. Każda partia do 1000 wierszy jest zatwierdzana osobno, więc dziennik transakcji pozostaje mały.

Jak zrobić zrzut Oracle dla najlepszego wyniku

Konwerter odczytuje to, co zawiera zrzut. Te opcje zachowują w nim więcej twoich danych:

  • W SQL Developer wybierz Tools, Database Export, z DDL i formatem danych Insert. SQLcl zapisuje to samo z SET SQLFORMAT INSERT.
  • Przed eksportem uruchom ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS': domyślny format zapisuje daty bez godziny i stulecia.
  • Plik .dmp z exp lub expdp jest binarny: zaimportuj go do bazy Oracle, np. Oracle Database Free w Dockerze, i wyeksportuj przez SQL Developer.

Co nie jest konwertowane

Widoki, pakiety, procedury, funkcje, wyzwalacze, typy i synonimy są pisane w PL/SQL. Raport wymienia je z nazwy i nigdy nie pomija ich po cichu, więc możesz je przepisać dla SQL Server.

Pytania o konwersję Oracle do SQL Server

Nie ma tu odpowiedzi? Napisz do nas przez stronę kontaktu, a odpowie człowiek. Strona kontaktu

Czy mój zrzut jest wysyłany?

Nie. Konwerter działa w przeglądarce i odczytuje zrzut z dysku po kawałku, więc nigdy nie opuszcza on twojego komputera. Aplikacja na komputer i wiersz poleceń też konwertują na twoim komputerze.

Jak duży może być zrzut?

Konwerter nigdy nie trzyma całego zrzutu w pamięci: czyta plik dwa razy, fragmentami, i zapisuje skrypt na bieżąco. Zrzuty wielogigabajtowe konwertują się w przeglądarce, w aplikacji na komputer i w wierszu poleceń.

Czy mogę przekonwertować plik .dmp z exp lub expdp?

Nie bezpośrednio: Data Pump i oryginalny Export zapisują format binarny, który czyta tylko Oracle. Zaimportuj plik do dowolnej bazy Oracle (Oracle Database Free działa w Dockerze) i wyeksportuj go przez Database Export w SQL Developer lub przez SQLcl. Konwerter informuje o tym, gdy dostanie plik .dmp.

Z jakich wersji Oracle może pochodzić eksport?

Eksporty z SQL Developer i SQLcl, z definicjami tabel z DBMS_METADATA, z Oracle od wersji 11g. Każdy testowy eksport pochodzi z Oracle 21c i 23ai, w sesjach amerykańskich, niemieckich i ISO, i jest porównywany ze źródłem komórka po komórce.

Co dzieje się z NUMBER, DATE i innymi typami Oracle?

NUMBER staje się decimal lub bigint dla liczb całkowitych; DATE staje się datetime2(0) i zachowuje godzinę; tekst staje się nvarchar, porównywanym dokładnie jak w Oracle; CLOB nvarchar(max), BLOB varbinary(max). NaN i Infinity stają się NULL, a raport je liczy.

Czy kolumny identity i sekwencje są zachowywane?

Tak. Kolumny identity stają się kolumnami IDENTITY i idą dalej po najwyższym id; sekwencje stają się sekwencjami SQL Server, a wartości domyślne, które z nich pobierają, nadal z nich pobierają.

A pakiety PL/SQL, procedury i wyzwalacze?

Raport wymienia je z nazwy, ale nie są konwertowane, bo każda baza danych zapisuje je we własnym języku.

Na jakich wersjach SQL Server ładuje się skrypt?

SQL Server od 2017 do 2025. Ten sam skrypt ładuje się na każdej z nich i zatrzymuje przy pierwszym błędzie, jeśli coś pójdzie nie tak.