Langsung ke konten
Beranda IntoSQL

Konversi SQL Server ke Oracle

Letakkan skrip yang ditulis Generate Scripts di SSMS dengan schema dan data, sebagai .sql atau .sql.gz, UTF-16 atau UTF-8, lalu unduh skrip Oracle dengan tabel, kunci, indeks, dan data yang sama. Setiap nilai yang tidak bisa disimpan Oracle apa adanya, dan setiap objek yang tidak didukungnya, dicantumkan di laporan.

File Anda
sqlshop_2024_sqlserver.sqlFile contoh, 11 kB
Database Anda

18 baris dikonversi, 2 perbaikan, tidak ada yang ditolak

Tampilkan

Tabel di shop_2024_sqlserver.sqlDump SQL Server · ditulis oleh SQL Server Management Objects · utf-8

  • ordersditulis sebagai ORDERS10 baris1
    11 kolom
    IDNUMBER(10) not null
    CUSTOMER_IDNUMBER(10) not null
    STATUSVARCHAR2(10 CHAR) not null
    TOTALNUMBER(19,4) not null
    ITEMSNUMBER(3) not null
    ORDERED_ATTIMESTAMP(0) not null
    SHIPPED_ATTIMESTAMP(7)
    NOTECLOB
    DETAILSCLOB
    ORDER_REFVARCHAR2(36 CHAR) not null
    TOTAL_WITH_TAXNUMBER(12,2)
  • customersditulis sebagai CUSTOMERS8 baris1
    8 kolom
    IDNUMBER(10) not null
    NAMEVARCHAR2(100 CHAR) not null
    EMAILVARCHAR2(200 CHAR) not null
    COUNTRYVARCHAR2(2 CHAR) not null
    IS_ACTIVENUMBER(1) not null
    SIGNED_UPDATE
    CREATED_ATTIMESTAMP(0) WITH TIME ZONE not null
    ROW_VERSIONRAW(8)

Tidak dikonversi

  • View paid_orders
  • Trigger orders_no_negative

Setiap database menulis objek ini dalam bahasanya sendiri. Tulis ulang untuk Oracle.

-- Written by IntoSQL from a SQL Server dump. Load it with: NLS_LANG=.AL32UTF8 sqlplus -S -L <user>/<password>@<database> @<file>
WHENEVER SQLERROR EXIT FAILURE ROLLBACK;
SET DEFINE OFF;
SET SQLBLANKLINES ON;
SET FEEDBACK OFF;
SET SERVEROUTPUT ON;
CREATE OR REPLACE FUNCTION "INTOSQL_CLOB" (p SYS.ODCIVARCHAR2LIST) RETURN CLOB IS
    r CLOB;
BEGIN
    DBMS_LOB.CREATETEMPORARY(r, TRUE);
    FOR i IN 1 .. p.COUNT LOOP
        IF p(i) IS NOT NULL THEN
            DBMS_LOB.WRITEAPPEND(r, LENGTH2(p(i)), p(i));
        END IF;
    END LOOP;
    RETURN r;
END;
/
CREATE OR REPLACE FUNCTION "INTOSQL_BLOB" (p SYS.ODCIVARCHAR2LIST) RETURN BLOB IS
    r BLOB;
    piece RAW(2000);
BEGIN
    DBMS_LOB.CREATETEMPORARY(r, TRUE);
    FOR i IN 1 .. p.COUNT LOOP
        piece := HEXTORAW(p(i));
        DBMS_LOB.WRITEAPPEND(r, UTL_RAW.LENGTH(piece), piece);
    END LOOP;
    RETURN r;
END;
/

CREATE TABLE "ORDERS" (
    "ID" NUMBER(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 1),
    "CUSTOMER_ID" NUMBER(10) NOT NULL,
    "STATUS" VARCHAR2(10 CHAR) DEFAULT 'pending' NOT NULL,
    "TOTAL" NUMBER(19,4) NOT NULL,
    "ITEMS" NUMBER(3) DEFAULT 1 NOT NULL,
    "ORDERED_AT" TIMESTAMP(0) NOT NULL,
    "SHIPPED_AT" TIMESTAMP(7),
    "NOTE" CLOB,
    "DETAILS" CLOB,
    "ORDER_REF" VARCHAR2(36 CHAR) NOT NULL,
    "TOTAL_WITH_TAX" NUMBER(12,2) GENERATED ALWAYS AS (CAST(CAST("TOTAL" * (1.16) AS NUMBER(12,2)) AS NUMBER(12,2))) VIRTUAL,
    CONSTRAINT "CK_ORDERS_ITEMS" CHECK ("ITEMS" >= 0),
    CONSTRAINT "CHECK2" CHECK ("STATUS" = 'cancelled' OR "STATUS" = 'shipped' OR "STATUS" = 'paid' OR "STATUS" = 'pending'),
    CONSTRAINT "CHECK3" CHECK ("TOTAL" >= (0))
);

CREATE TABLE "CUSTOMERS" (
    "ID" NUMBER(10) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 1),
    "NAME" VARCHAR2(100 CHAR) NOT NULL,
    "EMAIL" VARCHAR2(200 CHAR) NOT NULL,
    "COUNTRY" VARCHAR2(2 CHAR) DEFAULT 'US' NOT NULL,
    "IS_ACTIVE" NUMBER(1) DEFAULT 1 NOT NULL,
    "SIGNED_UP" DATE,
    "CREATED_AT" TIMESTAMP(0) WITH TIME ZONE DEFAULT SYSTIMESTAMP NOT NULL,
    "ROW_VERSION" RAW(8),
    CONSTRAINT "CK_CUSTOMERS_IS_ACTIVE" CHECK ("IS_ACTIVE" IN (0, 1))
);

BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
1,
'Ana Martínez',
'ana@example.com',
'MX',
1,
DATE '2023-01-15',
TIMESTAMP '2023-01-15 04:24:00.0000000 -06:00'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
2,
'Zoë Müller',
'zoe@example.de',
'DE',
1,
DATE '2023-02-03',
TIMESTAMP '2023-02-03 09:11:42.0000000 +01:00'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
3,
'José Peña',
'jose@example.es',
'ES',
0,
DATE '2023-03-21',
TIMESTAMP '2023-03-21 20:05:17.0000000 +01:00'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
4,
'李雷',
'lilei@example.cn',
'CN',
1,
DATE '2023-05-09',
TIMESTAMP '2023-05-09 10:40:00.0000000 +08:00'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
5,
'Noah O''Brien',
'noah@example.ie',
'IE',
1,
NULL,
TIMESTAMP '2023-06-30 15:00:00.0000000 +01:00'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
6,
'Amélie Laurent',
'amelie@example.fr',
'FR',
1,
DATE '2024-01-02',
TIMESTAMP '2024-01-02 10:30:00.0000000 +01:00'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
7,
'Ravi Patel',
'ravi@example.in',
'IN',
0,
DATE '2024-02-29',
TIMESTAMP '2024-03-01 05:29:59.0000000 +05:30'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "CUSTOMERS" (
"ID",
"NAME",
"EMAIL",
"COUNTRY",
"IS_ACTIVE",
"SIGNED_UP",
"CREATED_AT"
) VALUES (
8,
'Sofia Rossi 🌻',
'sofia@example.it',
'IT',
1,
DATE '2024-04-12',
TIMESTAMP '2024-04-12 14:12:12.0000000 +02:00'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
1,
1,
'shipped',
129.9000,
3,
TIMESTAMP '2024-03-01 10:00:00.0000000',
TIMESTAMP '2024-03-02 16:30:00.1234567',
NULL,
'{"gift": false}',
'0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
2,
2,
'paid',
54.0000,
1,
TIMESTAMP '2024-03-02 11:15:00.0000000',
NULL,
'Gift wrap 🎁',
'{"gift": true, "wrap": "red"}',
'1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
3,
1,
'cancelled',
12.5000,
1,
TIMESTAMP '2024-03-03 09:45:00.0000000',
NULL,
'Customer changed their mind',
NULL,
'2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
4,
4,
'shipped',
980.0000,
12,
TIMESTAMP '2024-03-05 02:10:00.0000000',
TIMESTAMP '2024-03-07 08:00:00.0000000',
'请小心轻放',
'{"fragile": true}',
'3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
5,
5,
'pending',
45.7500,
2,
TIMESTAMP '2024-03-08 17:20:00.0000000',
NULL,
'Leave at the door; ring twice',
NULL,
'4f1e806c-7d5b-4c2e-9a99-5e6f708192a3'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
6,
6,
'shipped',
310.4000,
5,
TIMESTAMP '2024-03-10 13:00:00.0000000',
TIMESTAMP '2024-03-11 09:00:00.0000000',
'Fragile: "glass"',
'{"fragile": true}',
'50f2917d-8e6c-4d3f-8baa-6f708192a3b4'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
7,
8,
'paid',
76.2000,
2,
TIMESTAMP '2024-03-11 18:45:00.0000000',
NULL,
NULL,
NULL,
'6103a28e-9f7d-4e40-9cbb-708192a3b4c5'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
8,
2,
'shipped',
19.9900,
1,
TIMESTAMP '2024-03-12 08:00:00.0000000',
TIMESTAMP '9999-12-31 23:59:59.9999999',
'Shipped date set to the maximum by an old import',
NULL,
'7214b39f-a08e-4f51-8dcc-8192a3b4c5d6'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
9,
3,
'shipped',
64.0000,
2,
TIMESTAMP '2024-03-14 15:30:00.0000000',
TIMESTAMP '2024-03-15 10:00:00.0000000',
'Two parcels',
'{"parcels": [1, 2]}',
'8325c4a0-b19f-4062-9edd-92a3b4c5d6e7'
);
COMMIT;
END;
/
BEGIN
INSERT INTO "ORDERS" (
"ID",
"CUSTOMER_ID",
"STATUS",
"TOTAL",
"ITEMS",
"ORDERED_AT",
"SHIPPED_AT",
"NOTE",
"DETAILS",
"ORDER_REF"
) VALUES (
10,
7,
'paid',
1499.0000,
1,
TIMESTAMP '2024-03-15 21:05:00.0000000',
NULL,
'C:\Users\ravi\invoice.pdf',
NULL,
'9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8'
);
COMMIT;
END;
/

-- Keys, indexes, foreign keys, counters and triggers, after the rows.
ALTER TABLE "ORDERS" ADD CONSTRAINT "PK_ORDERS" PRIMARY KEY ("ID");
ALTER TABLE "CUSTOMERS" ADD CONSTRAINT "PK_CUSTOMERS" PRIMARY KEY ("ID");
ALTER TABLE "CUSTOMERS" ADD CONSTRAINT "UQ_CUSTOMERS_EMAIL" UNIQUE ("EMAIL");
CREATE INDEX "IX_ORDERS_IDX_ORDERS_CUSTOMER" ON "ORDERS" ("CUSTOMER_ID");
CREATE INDEX "IX_ORDERS_IDX_ORDERS_STATUS_DATE" ON "ORDERS" ("STATUS", "ORDERED_AT");
ALTER TABLE "ORDERS" ADD CONSTRAINT "FK_ORDERS" FOREIGN KEY ("CUSTOMER_ID") REFERENCES "CUSTOMERS" ("ID") ENABLE NOVALIDATE;
BEGIN
    EXECUTE IMMEDIATE 'ALTER TABLE "ORDERS" ENABLE VALIDATE CONSTRAINT "FK_ORDERS"';
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Foreign key ' || '"FK_ORDERS"' || ' has rows without a parent: it stays unvalidated, and new rows are checked.');
END;
/
DECLARE
    next_id NUMBER;
BEGIN
    SELECT NVL(MAX("ID"), 0) + 1 INTO next_id FROM "ORDERS";
    IF next_id < 1 THEN
        next_id := 1;
    END IF;
    EXECUTE IMMEDIATE 'ALTER TABLE "ORDERS" MODIFY ("ID" GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH ' || next_id || '))';
END;
/
DECLARE
    next_id NUMBER;
BEGIN
    SELECT NVL(MAX("ID"), 0) + 1 INTO next_id FROM "CUSTOMERS";
    IF next_id < 1 THEN
        next_id := 1;
    END IF;
    EXECUTE IMMEDIATE 'ALTER TABLE "CUSTOMERS" MODIFY ("ID" GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH ' || next_id || '))';
END;
/
COMMENT ON TABLE "CUSTOMERS" IS 'People who bought at least once';
DROP FUNCTION "INTOSQL_CLOB";
DROP FUNCTION "INTOSQL_BLOB";
COMMIT;
EXIT;

Perbaikan

  1. "total_with_tax" di orders disimpan di sumber; Oracle menghitungnya saat dibaca.
  2. "row_version" dari customers adalah versi baris yang diatur SQL Server sendiri; dump tidak berisi nilainya, jadi menjadi RAW(8) dan kosong.

Perlu diperiksa

  • 6 kolom teks di sumber membandingkan tanpa membedakan huruf besar dan kecil; Oracle membandingkan secara persis, jadi kunci unik dan pencarian bisa berperilaku berbeda. Gunakan collation atau tipe kolom yang tidak membedakan huruf besar dan kecil pada kolom yang membutuhkannya.
  • 2 view, trigger, rutin, atau event tidak dikonversi; laporan mencantumkan masing-masing. Buat ulang secara manual di Oracle.
  • CHECK check1 pada orders tidak bisa ditulis untuk Oracle (function isjson), jadi tidak dibuat. Tulis CHECK secara manual jika penting.
  • Indeks idx_orders_pending pada orders memakai ekspresi yang tidak bisa ditulis untuk Oracle (filtered index), jadi tidak dibuat. Buat indeks secara manual jika kueri memerlukannya.
  • Default "order_ref" di orders tidak bisa ditulis untuk Oracle (function uuid), jadi kolom itu tanpa default. Tambahkan default secara manual jika baris baru memerlukannya.

File Anda dikonversi di komputer ini dan tidak pernah diunggah.

Contoh lain:

Yang berubah dari SQL Server ke Oracle

Setiap baris adalah aturan yang diterapkan konverter, beserta baris laporan yang ditulisnya saat aturan itu mengubah sesuatu di data Anda.

  • bit

    NUMBER(1) dengan CHECK 0 dan 1

    Oracle 21c tidak punya tipe kolom boolean; 1 dan 0 mempertahankan nilainya di setiap versi.

  • char(n), varchar(n), nchar(n), nvarchar(n)

    VARCHAR2(n CHAR), menghitung karakter

    Panjang dihitung dalam karakter, seperti nvarchar di SQL Server.

  • varchar(max), nvarchar(max), text, ntext

    VARCHAR2(4000 CHAR) jika setiap nilai muat dalam 4000 byte, selain itu CLOB

    VARCHAR2 memuat 4000 byte secara default dan Oracle tidak bisa mengindeks CLOB, jadi teks tetap VARCHAR2 jika nilainya muat dan menjadi CLOB jika tidak.

    Baris laporan: text_as_lob

  • empty strings and empty binary values

    NULL

    Oracle menyimpan string kosong sebagai NULL, jadi nilai yang tadinya ' terbaca sebagai NULL. Laporan menghitungnya per kolom.

    Baris laporan: empty_string_null

  • decimal(p,s), money, smallmoney

    NUMBER(p,s); money sebagai NUMBER(19,4)

    NUMBER memuat 38 digit, sama seperti decimal, jadi setiap nilai tetap tepat.

  • datetime, datetime2, smalldatetime

    TIMESTAMP(p)

    datetime adalah pembacaan jam dinding, seperti TIMESTAMP di Oracle, yang menyimpan hingga sembilan digit detik. date menjadi DATE, yang juga memuat jam dalam sehari yang tetap di tengah malam.

  • datetimeoffset

    TIMESTAMP WITH TIME ZONE, dengan offset setiap nilai

    Oracle menyimpan offset dari -12:00 sampai +14:00; nilai dengan offset melewati -12:00 ditulis dalam UTC, momen yang sama.

  • time

    INTERVAL DAY TO SECOND sejak tengah malam

    Oracle tidak punya tipe jam dalam sehari; interval sejak tengah malam memuat setiap nilai.

  • dates that aren't valid

    NULL

    Nilai yang bukan tanggal menjadi NULL dan laporan menghitungnya.

    Baris laporan: date_out_of_range

  • json (SQL Server 2025)

    CLOB

    Nilai JSON yang sama, yang dibaca fungsi JSON di Oracle.

  • uniqueidentifier

    VARCHAR2(36)

    Identifier yang sama, ditulis dengan huruf kecil.

  • binary, varbinary, image

    RAW(n) dan BLOB

    Byte tetap byte.

  • geometry, geography

    BLOB dengan byte milik SQL Server

    SSMS menulis nilai spasial dalam serialisasi milik SQL Server, yang dipertahankan byte demi byte.

    Baris laporan: spatial_as_native

  • rowversion, timestamp

    BLOB, kosong

    SQL Server mengatur versi baris sendiri dan SSMS tidak menulis nilainya.

    Baris laporan: rowversion_empty

  • xml, sql_variant, hierarchyid, vector

    VARCHAR2 atau CLOB dengan teks setiap nilai

    Oracle tidak punya tipe yang setara; xml dan sql_variant mempertahankan teks setiap nilai dan hierarchyid jalurnya, misalnya /1/2/.

    Baris laporan: type_replaced

  • collations that ignore case (_CI_)

    perbandingan persis

    Oracle membandingkan teks secara persis kecuali diminta lain, jadi kolom yang mengabaikan huruf besar dan kecil di SQL Server kini membedakan Ana dan ana.

    Baris laporan: case_insensitive_collation

  • IDENTITY

    GENERATED BY DEFAULT ON NULL AS IDENTITY, berlanjut setelah id tertinggi

    Id yang disalin dimuat apa adanya, dan penghitung berlanjut setelah id tertinggi.

  • CREATE SEQUENCE

    CREATE SEQUENCE dengan opsi yang sama

    Sequence Oracle bekerja dengan cara yang sama. SSMS tidak menulis posisi yang sudah dicapai sequence, jadi sequence mulai dari titik saat dibuat.

  • computed columns

    kolom virtual

    Oracle menghitung kolom generated hanya saat dibaca; kolom PERSISTED menjadi virtual dengan nilai yang sama.

    Baris laporan: stored_as_virtual

  • computed columns with functions Oracle lacks

    kolom biasa

    Rumus yang tidak bisa ditulis menyisakan kolom biasa dan satu baris laporan; SSMS tidak menulis nilai untuk kolom terhitung.

    Baris laporan: generated_not_translated

  • defaults with functions Oracle lacks, and NEXT VALUE FOR

    tanpa default

    Default yang tidak bisa ditulis dihilangkan dan dilaporkan.

    Baris laporan: default_not_translated

  • CHECK constraints

    diterjemahkan

    CHECK yang sama, diuji saat setiap baris dimuat.

  • CHECK constraints with functions Oracle lacks

    tidak dibuat

    CHECK yang tidak bisa ditulis dihilangkan dan dilaporkan.

    Baris laporan: check_skipped

  • CHECK constraints added WITH NOCHECK or disabled

    tidak dibuat

    SQL Server tidak menerapkan CHECK ini, jadi baris bisa melanggarnya.

    Baris laporan: check_not_enforced

  • filtered and columnstore indexes, and indexes on CLOB columns

    tidak dibuat

    IntoSQL menulis indeks b-tree pada kolom utuh; buat ulang indeks lainnya setelah pemuatan.

    Baris laporan: index_skipped

  • foreign keys

    setelah data ENABLE NOVALIDATE, lalu divalidasi dengan peringatan untuk baris yatim

    Key langsung memeriksa baris baru dan divalidasi terakhir; baris tanpa induk membuatnya tetap tidak tervalidasi dengan peringatan, bukan menghentikan pemuatan.

  • ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULT

    dihapus

    Foreign key Oracle hanya bertindak saat penghapusan, dengan CASCADE atau SET NULL.

    Baris laporan: foreign_key_action_unsupported

  • names over 128 bytes

    dipersingkat

    Nama di Oracle 12.2 ke atas memuat 128 byte; nama di SQL Server memuat 128 karakter.

    Baris laporan: name_shortened

  • foreign keys to tables the dump doesn't create

    tidak dibuat

    Key tidak bisa merujuk ke tabel yang tidak ada.

    Baris laporan: foreign_key_skipped

  • tables on a partition scheme

    satu tabel dengan baris dari setiap partisi

    Barisnya sama; partisi ulang tabel di Oracle jika diperlukan.

    Baris laporan: partitions_dropped

  • temporal tables (SYSTEM_VERSIONING)

    dua tabel: baris saat ini dan riwayatnya

    Tabel dan tabel riwayatnya disalin sebagai tabel biasa; Oracle tidak menyimpan riwayat sendiri.

    Baris laporan: system_versioning_dropped

  • schemas

    satu skema, nama tabel diawali nama skemanya

    Skrip dimuat ke schema pengguna yang menjalankannya, jadi tabel dari schema berbeda diberi nama schema-nya di depan; tabel di dbo mempertahankan namanya.

    Baris laporan: schemas_merged

  • NOT NULL columns with values that become NULL

    NOT NULL dihapus

    Kolom yang nilainya harus menjadi NULL tidak bisa mempertahankan NOT NULL, atau pemuatan akan berhenti.

    Baris laporan: not_null_relaxed

  • views, functions, procedures, triggers, synonyms, types and partition functions

    dicantumkan di laporan

    Kodenya ditulis dalam T-SQL, jadi dicantumkan agar Anda bisa membuatnya ulang.

    Baris laporan: not_converted_objects

  • scripts without CREATE TABLE (data only)

    tipe dibaca dari nilai

    Skrip yang hanya berisi data hanya punya baris, jadi tipenya diambil dari nilai.

    Baris laporan: no_schema

  • expressions in INSERT values

    NULL

    Konverter yang tidak menjalankan database tidak bisa mengevaluasinya.

    Baris laporan: expression_value

  • types IntoSQL doesn't know

    CLOB

    Text memuat nilai apa pun; ubah tipenya setelah pemuatan.

    Baris laporan: unknown_type

  • NUL characters in text

    dipertahankan

    VARCHAR2 dan CLOB bisa memuat karakter NUL, jadi nilainya disalin apa adanya.

  • text that isn't valid in its encoding

    byte yang rusak menjadi karakter pengganti

    Skripnya UTF-8 dan setiap nilai harus berupa teks yang valid.

    Baris laporan: invalid_utf8_replaced

  • text decoded twice (ñ)

    disalin apa adanya

    Skrip berisi persis karakter ini, jadi karakter itu disalin; laporan menunjukkannya.

    Baris laporan: mojibake_suspected

Di SQL ServerDi OracleBaris laporan
bitNUMBER(1) dengan CHECK 0 dan 1Oracle 21c tidak punya tipe kolom boolean; 1 dan 0 mempertahankan nilainya di setiap versi.
char(n), varchar(n), nchar(n), nvarchar(n)VARCHAR2(n CHAR), menghitung karakterPanjang dihitung dalam karakter, seperti nvarchar di SQL Server.
varchar(max), nvarchar(max), text, ntextVARCHAR2(4000 CHAR) jika setiap nilai muat dalam 4000 byte, selain itu CLOBVARCHAR2 memuat 4000 byte secara default dan Oracle tidak bisa mengindeks CLOB, jadi teks tetap VARCHAR2 jika nilainya muat dan menjadi CLOB jika tidak.text_as_lob
empty strings and empty binary valuesNULLOracle menyimpan string kosong sebagai NULL, jadi nilai yang tadinya ' terbaca sebagai NULL. Laporan menghitungnya per kolom.empty_string_null
decimal(p,s), money, smallmoneyNUMBER(p,s); money sebagai NUMBER(19,4)NUMBER memuat 38 digit, sama seperti decimal, jadi setiap nilai tetap tepat.
datetime, datetime2, smalldatetimeTIMESTAMP(p)datetime adalah pembacaan jam dinding, seperti TIMESTAMP di Oracle, yang menyimpan hingga sembilan digit detik. date menjadi DATE, yang juga memuat jam dalam sehari yang tetap di tengah malam.
datetimeoffsetTIMESTAMP WITH TIME ZONE, dengan offset setiap nilaiOracle menyimpan offset dari -12:00 sampai +14:00; nilai dengan offset melewati -12:00 ditulis dalam UTC, momen yang sama.
timeINTERVAL DAY TO SECOND sejak tengah malamOracle tidak punya tipe jam dalam sehari; interval sejak tengah malam memuat setiap nilai.
dates that aren't validNULLNilai yang bukan tanggal menjadi NULL dan laporan menghitungnya.date_out_of_range
json (SQL Server 2025)CLOBNilai JSON yang sama, yang dibaca fungsi JSON di Oracle.
uniqueidentifierVARCHAR2(36)Identifier yang sama, ditulis dengan huruf kecil.
binary, varbinary, imageRAW(n) dan BLOBByte tetap byte.
geometry, geographyBLOB dengan byte milik SQL ServerSSMS menulis nilai spasial dalam serialisasi milik SQL Server, yang dipertahankan byte demi byte.spatial_as_native
rowversion, timestampBLOB, kosongSQL Server mengatur versi baris sendiri dan SSMS tidak menulis nilainya.rowversion_empty
xml, sql_variant, hierarchyid, vectorVARCHAR2 atau CLOB dengan teks setiap nilaiOracle tidak punya tipe yang setara; xml dan sql_variant mempertahankan teks setiap nilai dan hierarchyid jalurnya, misalnya /1/2/.type_replaced
collations that ignore case (_CI_)perbandingan persisOracle membandingkan teks secara persis kecuali diminta lain, jadi kolom yang mengabaikan huruf besar dan kecil di SQL Server kini membedakan Ana dan ana.case_insensitive_collation
IDENTITYGENERATED BY DEFAULT ON NULL AS IDENTITY, berlanjut setelah id tertinggiId yang disalin dimuat apa adanya, dan penghitung berlanjut setelah id tertinggi.
CREATE SEQUENCECREATE SEQUENCE dengan opsi yang samaSequence Oracle bekerja dengan cara yang sama. SSMS tidak menulis posisi yang sudah dicapai sequence, jadi sequence mulai dari titik saat dibuat.
computed columnskolom virtualOracle menghitung kolom generated hanya saat dibaca; kolom PERSISTED menjadi virtual dengan nilai yang sama.stored_as_virtual
computed columns with functions Oracle lackskolom biasaRumus yang tidak bisa ditulis menyisakan kolom biasa dan satu baris laporan; SSMS tidak menulis nilai untuk kolom terhitung.generated_not_translated
defaults with functions Oracle lacks, and NEXT VALUE FORtanpa defaultDefault yang tidak bisa ditulis dihilangkan dan dilaporkan.default_not_translated
CHECK constraintsditerjemahkanCHECK yang sama, diuji saat setiap baris dimuat.
CHECK constraints with functions Oracle lackstidak dibuatCHECK yang tidak bisa ditulis dihilangkan dan dilaporkan.check_skipped
CHECK constraints added WITH NOCHECK or disabledtidak dibuatSQL Server tidak menerapkan CHECK ini, jadi baris bisa melanggarnya.check_not_enforced
filtered and columnstore indexes, and indexes on CLOB columnstidak dibuatIntoSQL menulis indeks b-tree pada kolom utuh; buat ulang indeks lainnya setelah pemuatan.index_skipped
foreign keyssetelah data ENABLE NOVALIDATE, lalu divalidasi dengan peringatan untuk baris yatimKey langsung memeriksa baris baru dan divalidasi terakhir; baris tanpa induk membuatnya tetap tidak tervalidasi dengan peringatan, bukan menghentikan pemuatan.
ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULTdihapusForeign key Oracle hanya bertindak saat penghapusan, dengan CASCADE atau SET NULL.foreign_key_action_unsupported
names over 128 bytesdipersingkatNama di Oracle 12.2 ke atas memuat 128 byte; nama di SQL Server memuat 128 karakter.name_shortened
foreign keys to tables the dump doesn't createtidak dibuatKey tidak bisa merujuk ke tabel yang tidak ada.foreign_key_skipped
tables on a partition schemesatu tabel dengan baris dari setiap partisiBarisnya sama; partisi ulang tabel di Oracle jika diperlukan.partitions_dropped
temporal tables (SYSTEM_VERSIONING)dua tabel: baris saat ini dan riwayatnyaTabel dan tabel riwayatnya disalin sebagai tabel biasa; Oracle tidak menyimpan riwayat sendiri.system_versioning_dropped
schemassatu skema, nama tabel diawali nama skemanyaSkrip dimuat ke schema pengguna yang menjalankannya, jadi tabel dari schema berbeda diberi nama schema-nya di depan; tabel di dbo mempertahankan namanya.schemas_merged
NOT NULL columns with values that become NULLNOT NULL dihapusKolom yang nilainya harus menjadi NULL tidak bisa mempertahankan NOT NULL, atau pemuatan akan berhenti.not_null_relaxed
views, functions, procedures, triggers, synonyms, types and partition functionsdicantumkan di laporanKodenya ditulis dalam T-SQL, jadi dicantumkan agar Anda bisa membuatnya ulang.not_converted_objects
scripts without CREATE TABLE (data only)tipe dibaca dari nilaiSkrip yang hanya berisi data hanya punya baris, jadi tipenya diambil dari nilai.no_schema
expressions in INSERT valuesNULLKonverter yang tidak menjalankan database tidak bisa mengevaluasinya.expression_value
types IntoSQL doesn't knowCLOBText memuat nilai apa pun; ubah tipenya setelah pemuatan.unknown_type
NUL characters in textdipertahankanVARCHAR2 dan CLOB bisa memuat karakter NUL, jadi nilainya disalin apa adanya.
text that isn't valid in its encodingbyte yang rusak menjadi karakter penggantiSkripnya UTF-8 dan setiap nilai harus berupa teks yang valid.invalid_utf8_replaced
text decoded twice (ñ)disalin apa adanyaSkrip berisi persis karakter ini, jadi karakter itu disalin; laporan menunjukkannya.mojibake_suspected

Muat skrip ke Oracle

Skrip membuat tabel, menyalin baris, lalu menambahkan kunci, indeks, dan foreign key, jadi pemuatan berjalan cepat dan berhenti di galat pertama.

NLS_LANG=.AL32UTF8 sqlplus -S -L user@//localhost/mydb @sql_server.oracle.sql

Foreign key ditambahkan ENABLE NOVALIDATE, jadi baris baru langsung diperiksa, lalu divalidasi. Jika baris lama merujuk ke baris yang tidak ada, skrip menyebutkan constraint mana dan membiarkannya tidak tervalidasi, bukan gagal di tengah jalan.

Untuk dump yang besar, jalankan SQL*Plus di mesin yang sama dengan database. Skrip melakukan commit setiap 100 baris. Pengguna yang menjalankannya memerlukan CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER, dan CREATE PROCEDURE, serta kuota di tablespace-nya.

Buat dump SQL Server untuk hasil terbaik

Konverter membaca apa yang ada di dump. Opsi berikut membuat lebih banyak data Anda tetap ada di dalamnya:

  • Di SSMS, klik kanan database, Tasks, Generate Scripts, lalu pilih tabelnya. dbatools, mssql-scripter, dan alat lain yang dibangun di atas library yang sama menulis skrip yang sama.
  • Di Advanced, atur Types of data to script ke Schema and data. Skrip yang hanya berisi schema punya tabel tanpa baris.
  • Simpan sebagai Unicode, default SSMS, atau sebagai UTF-8: keduanya dibaca dengan cara yang sama, dan gzip juga bisa.

Yang tidak dikonversi

View, fungsi, prosedur, trigger, sinonim, rule, dan kebijakan keamanan ditulis dalam T-SQL. Semuanya dicantumkan di laporan berdasarkan nama, tidak pernah dibuang diam-diam, sehingga Anda bisa menulis ulang untuk Oracle.

Pertanyaan tentang SQL Server ke Oracle

Tidak terjawab di sini? Tulis ke kami dari halaman kontak, dan seseorang akan membalas. Halaman kontak

Apakah dump saya diunggah?

Tidak. Konverter berjalan di browser Anda dan membaca dump dari disk Anda sepotong demi sepotong, jadi dump tidak pernah meninggalkan komputer Anda. Aplikasi desktop dan command line juga mengonversi di komputer Anda.

Seberapa besar dump yang bisa dipakai?

Konverter tidak pernah menyimpan seluruh dump di memori: file dibaca dua kali, per rentang, dan skrip ditulis sambil berjalan. Dump berukuran beberapa gigabyte bisa dikonversi di browser, di aplikasi desktop, dan dengan command line.

Apakah file UTF-16 yang disimpan SSMS bisa dibaca?

Ya. SSMS menyimpan skrip sebagai UTF-16 secara default, dan konverter membaca UTF-16 dan UTF-8 sama baiknya, di-gzip atau tidak, dengan GO di antara batch.

Skrip dari versi SQL Server mana yang bisa dipakai?

Skrip yang ditulis SSMS, dbatools, atau mssql-scripter dari SQL Server 2017 ke atas. Setiap skrip uji berasal dari SQL Server 2017, 2022, dan 2025 dan dibandingkan dengan sumbernya sel demi sel.

Apakah nilai IDENTITY dipertahankan?

Ya. Kolom IDENTITY menjadi kolom identity, setiap baris mempertahankan id-nya, dan id berikutnya berlanjut setelah id tertinggi. Sequence dibuat dengan opsi yang sama.

Apa yang terjadi pada money, datetimeoffset, dan tipe SQL Server lainnya?

bit menjadi NUMBER(1), datetime2 menjadi TIMESTAMP dengan setiap digit, datetimeoffset menjadi TIMESTAMP WITH TIME ZONE dengan offset-nya, dan nvarchar(max) menjadi CLOB jika nilainya tidak muat di VARCHAR2. String kosong menjadi NULL, seperti yang disimpan Oracle, dan laporan menghitungnya.

Bagaimana dengan prosedur, trigger, dan view?

Semuanya dicantumkan di laporan berdasarkan nama dan tidak dikonversi, karena setiap database menulisnya dalam bahasanya sendiri.

Di versi Oracle mana skrip bisa dimuat?

Oracle 19c dan yang lebih baru. Setiap skrip uji dimuat di 21c dan 23ai, dan berhenti di galat pertama jika ada yang salah.