Konversi Oracle ke SQL Server
Letakkan file .sql yang ditulis Database Export di SQL Developer atau SQLcl, dengan tabel dan pernyataan Insert-nya, lalu unduh skrip SQL Server dengan tabel, kunci, indeks, dan data yang sama. Setiap nilai yang tidak bisa disimpan SQL Server apa adanya, dan setiap objek yang tidak didukungnya, dicantumkan di laporan.
18 baris dikonversi, 2 perbaikan, tidak ada yang ditolak
Tabel di shop_2024_oracle.sqlDump Oracle · ditulis oleh SQL Developer · utf-8
customers8 baris1
7 kolom id bigint not null name nvarchar(200) not null email nvarchar(150) not null country nvarchar(2) not null is_active smallint not null signed_up datetime2(0) created_at datetime2(0) not null orders10 baris1
9 kolom id bigint not null customer_id bigint not null invoice bigint status nvarchar(10) not null total decimal(10,2) not null items int not null ordered_at datetime2(0) not null shipped_at datetime2(0) note nvarchar(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
Perbaikan
- "name" di customers berisi karakter yang dihitung dua kali oleh SQL Server, seperti emoji, jadi menjadi nvarchar(200).
- "note" di orders berisi karakter yang dihitung dua kali oleh SQL Server, seperti emoji, jadi menjadi nvarchar(510).
File Anda dikonversi di komputer ini dan tidak pernah diunggah.
Contoh lain:
Yang berubah dari Oracle ke SQL Server
Setiap baris adalah aturan yang diterapkan konverter, beserta baris laporan yang ditulisnya saat aturan itu mengubah sesuatu di data Anda.
BOOLEAN (23ai)
bit
SQL Server tidak punya kolom boolean, jadi TRUE dan FALSE menjadi 1 dan 0.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG
nvarchar(n), nchar(n), dan nvarchar(max)
Panjang dihitung dalam karakter, baik Oracle menghitung byte maupun karakter, jadi setiap nilai muat.
VARCHAR2 and NVARCHAR2 past what the target's own types hold
nvarchar(2n), atau nvarchar(max) jika lebih dari 4000
nvarchar menghitung unit UTF-16 dan satu emoji memakai dua, jadi kolomnya diberi ruang untuk setiap nilai.
Baris laporan: text_length_widened
NUMBER, NUMBER(p,s), FLOAT(b)
decimal(p,s), atau bigint
NUMBER mempertahankan setiap digit; NUMBER tanpa presisi yang semua nilainya bilangan bulat hingga 18 digit menjadi integer 64-bit, dan skala negatif memuat digit sebanyak itu sebelum titik desimal.
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND
nvarchar(100) berisi teks Oracle, misalnya +01-06
SQL Server tidak punya tipe interval; teksnya mempertahankan setiap bagian.
Baris laporan: type_replaced
DATE, TIMESTAMP(p)
datetime2(p)
DATE di Oracle memuat waktu hingga detik, jadi merupakan tanggal dan waktu. Ekspor dalam sesi Amerika atau Jerman menulis tanggal tanpa jam atau abadnya (DD-MON-RR); ekspor dalam sesi ISO (SYYYY-MM-DD HH24:MI:SS) agar keduanya tetap ada.
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE
datetimeoffset, dengan offset setiap nilai
Tipe dan nilai yang sama.
JSON (21c), and CLOB holding JSON
nvarchar(max)
Nilai JSON yang sama; NULL SQL yang ditulis ekspor sebagai 'null' tetap NULL.
BLOB, RAW(n), LONG RAW
binary(n), varbinary(n), dan varbinary(max)
Byte tetap byte.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRY
nvarchar(max), dan xml untuk XMLTYPE
Tipe khusus Oracle tidak punya padanan; nilainya mempertahankan teksnya, termasuk nilai ROWID, meski tidak bermakna di luar Oracle.
collations that ignore case (BINARY_CI)
collation yang sama di setiap kolom
Kolom dibandingkan dan diurutkan seperti sebelumnya, dan unique key membedakan baris yang sama.
identity columns, and a sequence a BEFORE INSERT trigger assigns
IDENTITY, berlanjut setelah id tertinggi
Id yang disalin dimuat apa adanya, dan penghitung berlanjut setelah id tertinggi. Kolom yang diisi trigger dari sequence (cara sebelum 12c) juga menjadi identity.
identity columns the target can't count
bilangan bulat biasa
SQL Server menghitung satu kolom IDENTITY per tabel; kolom lain mempertahankan nilainya tanpa penghitung.
Baris laporan: counter_dropped
CREATE SEQUENCE
CREATE SEQUENCE dengan opsi yang sama
Ekspor menulis posisi yang sudah dicapai sequence sebagai START WITH-nya, jadi sequence berlanjut dari sana.
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)
kolom terhitung
SQL Server menghitungnya dari rumus yang sama; nilai yang ditulis ekspor untuknya tidak disertakan.
virtual columns with functions IntoSQL doesn't write, and the || operator
kolom biasa
Rumus yang tidak bisa ditulis untuk SQL Server menyisakan kolom biasa dan satu baris laporan; nilai yang ditulis ekspor untuk kolom virtual tidak disertakan, dan SQL Server tidak punya apa pun untuk dihitung.
Baris laporan: generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)
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 IntoSQL doesn't write
tidak dibuat
CHECK yang tidak bisa ditulis dihilangkan dan dilaporkan.
Baris laporan: check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATE
tidak dibuat
Oracle tidak menerapkan CHECK ini pada baris yang sudah ada, jadi baris bisa melanggarnya.
Baris laporan: check_not_enforced
function-based, bitmap and domain indexes
tidak dibuat
IntoSQL menulis indeks b-tree pada kolom utuh; buat ulang indeks lainnya setelah pemuatan.
Baris laporan: index_skipped
foreign keys
setelah data WITH NOCHECK, lalu diperiksa dengan peringatan untuk baris yatim
Key dibuat setelah baris dan diperiksa terakhir; baris tanpa induk membuatnya tetap tidak diperiksa dengan peringatan, bukan menghentikan pemuatan.
ON DELETE CASCADE that cascades in a cycle or along a second path
NO ACTION
SQL Server menolak cascade yang berputar atau mengambil jalur kedua, jadi key dibuat tanpa aksi itu dan laporan menyebutkannya.
Baris laporan: foreign_key_action_dropped
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones
tidak dibuat
Key tidak bisa merujuk ke tabel yang tidak ada, dan key yang tidak diperiksa Oracle bisa punya baris tanpa induk.
Baris laporan: foreign_key_skipped
partitioned tables
satu tabel dengan baris dari setiap partisi
Barisnya sama; partisi ulang tabel di SQL Server jika diperlukan.
Baris laporan: partitions_dropped
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, synonyms, types, packages, procedures, functions and other triggers
dicantumkan di laporan
Kodenya ditulis dalam PL/SQL, jadi dicantumkan agar Anda bisa membuatnya ulang.
Baris laporan: not_converted_objects
exports without CREATE TABLE (data only)
tipe dibaca dari nilai
Ekspor yang hanya berisi data hanya punya baris, jadi tipenya diambil dari nilai.
Baris laporan: no_schema
expressions in INSERT values other than the ones exports write
NULL
Konverter yang tidak menjalankan database tidak bisa mengevaluasinya; to_date, to_timestamp, TO_CLOB, HEXTORAW, dan fungsi lain yang ditulis ekspor tetap dibaca.
Baris laporan: expression_value
types IntoSQL doesn't know, and object types
nvarchar(max)
Text memuat nilai apa pun; ubah tipenya setelah pemuatan.
Baris laporan: unknown_type
dates before year 1 and time zones given as region names
NULL
Nilai yang bukan tanggal menjadi NULL dan laporan menghitungnya.
Baris laporan: date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE
NULL
Tipe floating-point di SQL Server tidak punya NaN atau infinity, jadi nilai itu menjadi NULL dan laporan menghitungnya.
Baris laporan: invalid_value_null
NUL characters in text
dipertahankan
nvarchar 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 Oracle | Di SQL Server | Baris laporan |
|---|---|---|
| BOOLEAN (23ai) | bitSQL Server tidak punya kolom boolean, jadi TRUE dan FALSE menjadi 1 dan 0. | |
| VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG | nvarchar(n), nchar(n), dan nvarchar(max)Panjang dihitung dalam karakter, baik Oracle menghitung byte maupun karakter, jadi setiap nilai muat. | |
| VARCHAR2 and NVARCHAR2 past what the target's own types hold | nvarchar(2n), atau nvarchar(max) jika lebih dari 4000nvarchar menghitung unit UTF-16 dan satu emoji memakai dua, jadi kolomnya diberi ruang untuk setiap nilai. | text_length_widened |
| NUMBER, NUMBER(p,s), FLOAT(b) | decimal(p,s), atau bigintNUMBER mempertahankan setiap digit; NUMBER tanpa presisi yang semua nilainya bilangan bulat hingga 18 digit menjadi integer 64-bit, dan skala negatif memuat digit sebanyak itu sebelum titik desimal. | |
| INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND | nvarchar(100) berisi teks Oracle, misalnya +01-06SQL Server tidak punya tipe interval; teksnya mempertahankan setiap bagian. | type_replaced |
| DATE, TIMESTAMP(p) | datetime2(p)DATE di Oracle memuat waktu hingga detik, jadi merupakan tanggal dan waktu. Ekspor dalam sesi Amerika atau Jerman menulis tanggal tanpa jam atau abadnya (DD-MON-RR); ekspor dalam sesi ISO (SYYYY-MM-DD HH24:MI:SS) agar keduanya tetap ada. | |
| TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE | datetimeoffset, dengan offset setiap nilaiTipe dan nilai yang sama. | |
| JSON (21c), and CLOB holding JSON | nvarchar(max)Nilai JSON yang sama; NULL SQL yang ditulis ekspor sebagai 'null' tetap NULL. | |
| BLOB, RAW(n), LONG RAW | binary(n), varbinary(n), dan varbinary(max)Byte tetap byte. | |
| ROWID, UROWID, XMLTYPE, SDO_GEOMETRY | nvarchar(max), dan xml untuk XMLTYPETipe khusus Oracle tidak punya padanan; nilainya mempertahankan teksnya, termasuk nilai ROWID, meski tidak bermakna di luar Oracle. | |
| collations that ignore case (BINARY_CI) | collation yang sama di setiap kolomKolom dibandingkan dan diurutkan seperti sebelumnya, dan unique key membedakan baris yang sama. | |
| identity columns, and a sequence a BEFORE INSERT trigger assigns | IDENTITY, berlanjut setelah id tertinggiId yang disalin dimuat apa adanya, dan penghitung berlanjut setelah id tertinggi. Kolom yang diisi trigger dari sequence (cara sebelum 12c) juga menjadi identity. | |
| identity columns the target can't count | bilangan bulat biasaSQL Server menghitung satu kolom IDENTITY per tabel; kolom lain mempertahankan nilainya tanpa penghitung. | counter_dropped |
| CREATE SEQUENCE | CREATE SEQUENCE dengan opsi yang samaEkspor menulis posisi yang sudah dicapai sequence sebagai START WITH-nya, jadi sequence berlanjut dari sana. | |
| virtual columns (GENERATED ALWAYS AS ... VIRTUAL) | kolom terhitungSQL Server menghitungnya dari rumus yang sama; nilai yang ditulis ekspor untuknya tidak disertakan. | |
| virtual columns with functions IntoSQL doesn't write, and the || operator | kolom biasaRumus yang tidak bisa ditulis untuk SQL Server menyisakan kolom biasa dan satu baris laporan; nilai yang ditulis ekspor untuk kolom virtual tidak disertakan, dan SQL Server tidak punya apa pun untuk dihitung. | generated_not_translated |
| defaults with functions IntoSQL doesn't write (SYS_GUID(), ||) | tanpa defaultDefault yang tidak bisa ditulis dihilangkan dan dilaporkan. | default_not_translated |
| CHECK constraints | diterjemahkanCHECK yang sama, diuji saat setiap baris dimuat. | |
| CHECK constraints with functions IntoSQL doesn't write | tidak dibuatCHECK yang tidak bisa ditulis dihilangkan dan dilaporkan. | check_skipped |
| CHECK constraints that are DISABLE or ENABLE NOVALIDATE | tidak dibuatOracle tidak menerapkan CHECK ini pada baris yang sudah ada, jadi baris bisa melanggarnya. | check_not_enforced |
| function-based, bitmap and domain indexes | tidak dibuatIntoSQL menulis indeks b-tree pada kolom utuh; buat ulang indeks lainnya setelah pemuatan. | index_skipped |
| foreign keys | setelah data WITH NOCHECK, lalu diperiksa dengan peringatan untuk baris yatimKey dibuat setelah baris dan diperiksa terakhir; baris tanpa induk membuatnya tetap tidak diperiksa dengan peringatan, bukan menghentikan pemuatan. | |
| ON DELETE CASCADE that cascades in a cycle or along a second path | NO ACTIONSQL Server menolak cascade yang berputar atau mengambil jalur kedua, jadi key dibuat tanpa aksi itu dan laporan menyebutkannya. | foreign_key_action_dropped |
| foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones | tidak dibuatKey tidak bisa merujuk ke tabel yang tidak ada, dan key yang tidak diperiksa Oracle bisa punya baris tanpa induk. | foreign_key_skipped |
| partitioned tables | satu tabel dengan baris dari setiap partisiBarisnya sama; partisi ulang tabel di SQL Server jika diperlukan. | partitions_dropped |
| NOT NULL columns with values that become NULL | NOT NULL dihapusKolom yang nilainya harus menjadi NULL tidak bisa mempertahankan NOT NULL, atau pemuatan akan berhenti. | not_null_relaxed |
| views, synonyms, types, packages, procedures, functions and other triggers | dicantumkan di laporanKodenya ditulis dalam PL/SQL, jadi dicantumkan agar Anda bisa membuatnya ulang. | not_converted_objects |
| exports without CREATE TABLE (data only) | tipe dibaca dari nilaiEkspor yang hanya berisi data hanya punya baris, jadi tipenya diambil dari nilai. | no_schema |
| expressions in INSERT values other than the ones exports write | NULLKonverter yang tidak menjalankan database tidak bisa mengevaluasinya; to_date, to_timestamp, TO_CLOB, HEXTORAW, dan fungsi lain yang ditulis ekspor tetap dibaca. | expression_value |
| types IntoSQL doesn't know, and object types | nvarchar(max)Text memuat nilai apa pun; ubah tipenya setelah pemuatan. | unknown_type |
| dates before year 1 and time zones given as region names | NULLNilai yang bukan tanggal menjadi NULL dan laporan menghitungnya. | date_out_of_range |
| NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE | NULLTipe floating-point di SQL Server tidak punya NaN atau infinity, jadi nilai itu menjadi NULL dan laporan menghitungnya. | invalid_value_null |
| NUL characters in text | dipertahankannvarchar bisa memuat karakter NUL, jadi nilainya disalin apa adanya. | |
| text that isn't valid in its encoding | byte 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 SQL Server
Skrip membuat tabel, menyalin baris, lalu menambahkan kunci, indeks, dan foreign key, jadi pemuatan berjalan cepat dan berhenti di galat pertama.
sqlcmd -b -f 65001 -S localhost -d mydb -i oracle.sql_server.sqlForeign key ditambahkan WITH NOCHECK lalu diperiksa. Jika sebuah baris merujuk ke baris yang tidak ada, skrip menyebutkan constraint mana dan membiarkannya tidak diperiksa, bukan gagal di tengah jalan.
Untuk dump yang besar, jalankan sqlcmd di mesin yang sama dengan server. Setiap batch berisi maksimal 1000 baris di-commit sendiri, jadi log transaksi tetap kecil.
Buat dump Oracle untuk hasil terbaik
Konverter membaca apa yang ada di dump. Opsi berikut membuat lebih banyak data Anda tetap ada di dalamnya:
- Di SQL Developer, pilih Tools, Database Export, dengan DDL dan format data Insert. SQLcl menulis hal yang sama dengan SET SQLFORMAT INSERT.
- Jalankan ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' sebelum mengekspor: format default menulis tanggal tanpa jam atau abadnya.
- File .dmp dari exp atau expdp bersifat biner: impor ke database Oracle, misalnya Oracle Database Free di Docker, lalu ekspor dengan SQL Developer.
Yang tidak dikonversi
View, paket, prosedur, fungsi, trigger, tipe, dan sinonim ditulis dalam PL/SQL. Semuanya dicantumkan di laporan berdasarkan nama, tidak pernah dibuang diam-diam, sehingga Anda bisa menulis ulang untuk SQL Server.
Pertanyaan tentang Oracle ke SQL Server
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.
Bisakah saya mengonversi file .dmp dari exp atau expdp?
Tidak secara langsung: Data Pump dan Export versi asli menulis format biner yang hanya bisa dibaca Oracle. Impor ke database Oracle mana pun, Oracle Database Free berjalan di Docker, lalu ekspor dengan Database Export di SQL Developer atau SQLcl. Konverter memberi tahu hal ini saat menerima file .dmp.
Ekspor dari versi Oracle mana yang bisa dipakai?
Ekspor dari SQL Developer dan SQLcl, dengan definisi tabel dari DBMS_METADATA, dari Oracle 11g ke atas. Setiap ekspor uji berasal dari Oracle 21c dan 23ai, dalam sesi Amerika, Jerman, dan ISO, dan dibandingkan dengan sumbernya sel demi sel.
Apa yang terjadi pada NUMBER, DATE, dan tipe Oracle lainnya?
NUMBER menjadi decimal, atau bigint untuk bilangan bulat; DATE menjadi datetime2(0), dengan waktunya tetap ada; teks menjadi nvarchar, dibandingkan secara persis seperti di Oracle; CLOB menjadi nvarchar(max), BLOB menjadi varbinary(max). NaN dan Infinity menjadi NULL dan laporan menghitungnya.
Apakah kolom identity dan sequence dipertahankan?
Ya. Kolom identity menjadi kolom IDENTITY dan berlanjut setelah id tertinggi; sequence menjadi sequence SQL Server, dan nilai default yang mengambil dari sequence tetap mengambil darinya.
Bagaimana dengan paket PL/SQL, prosedur, dan trigger?
Semuanya dicantumkan di laporan berdasarkan nama dan tidak dikonversi, karena setiap database menulisnya dalam bahasanya sendiri.
Di versi SQL Server mana skrip bisa dimuat?
SQL Server 2017 sampai 2025. Skrip yang sama dimuat di setiap versi itu, dan berhenti di galat pertama jika ada yang salah.