Chuyển đến nội dung
Trang chủ IntoSQL

Chuyển Oracle sang SQL Server

Thả tệp .sql mà Database Export của SQL Developer hoặc SQLcl ghi, với các bảng và câu lệnh Insert, và tải xuống tập lệnh SQL Server với cùng bảng, khóa, chỉ mục và dữ liệu. Mọi giá trị SQL Server không chứa được nguyên trạng, và mọi đối tượng nó không hỗ trợ, đều được liệt kê trong báo cáo.

Tệp của bạn
sqlshop_2024_oracle.sqlTệp mẫu, 9,3 kB
Cơ sở dữ liệu của bạn

Đã chuyển đổi 18 hàng, 2 bản sửa, không hàng nào bị từ chối

Hiển thị

Các bảng trong shop_2024_oracle.sqlBản dump Oracle · do SQL Developer ghi · utf-8

  • customers8 hàng1
    7 cột
    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 hàng1
    9 cột
    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

Bản sửa

  1. "name" của customers chứa ký tự mà SQL Server đếm hai lần, như emoji, nên là nvarchar(200).
  2. "note" của orders chứa ký tự mà SQL Server đếm hai lần, như emoji, nên là nvarchar(510).

Tệp được chuyển đổi ngay trên máy tính này và không bao giờ được tải lên.

Mẫu khác:

Những gì thay đổi từ Oracle sang SQL Server

Mỗi hàng là một quy tắc trình chuyển đổi áp dụng, kèm dòng báo cáo được ghi khi quy tắc thay đổi dữ liệu của bạn.

  • BOOLEAN (23ai)

    bit

    SQL Server không có cột boolean, nên TRUE và FALSE là 1 và 0.

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

    nvarchar(n), nchar(n) và nvarchar(max)

    Độ dài đếm theo ký tự, dù Oracle đếm theo byte hay ký tự, nên mọi giá trị đều vừa.

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

    nvarchar(2n), hoặc nvarchar(max) khi vượt 4000

    nvarchar đếm theo đơn vị UTF-16 và một emoji chiếm hai đơn vị, nên cột được cấp đủ chỗ cho mọi giá trị.

    Dòng báo cáo: text_length_widened

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

    decimal(p,s), hoặc bigint

    NUMBER giữ mọi chữ số; NUMBER không có độ chính xác mà mọi giá trị đều là số nguyên tối đa 18 chữ số sẽ thành số nguyên 64 bit, còn thang số âm chứa đủ bấy nhiêu chữ số trước dấu thập phân.

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    nvarchar(100) với văn bản của Oracle, ví dụ +01-06

    SQL Server không có kiểu interval; văn bản giữ mọi phần.

    Dòng báo cáo: type_replaced

  • DATE, TIMESTAMP(p)

    datetime2(p)

    DATE của Oracle chứa thời gian đến từng giây, nên nó là ngày và giờ. Bản xuất trong phiên kiểu Mỹ hoặc Đức ghi ngày mà không có giờ hay thế kỷ (DD-MON-RR); hãy xuất trong phiên ISO (SYYYY-MM-DD HH24:MI:SS) để giữ chúng.

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    datetimeoffset, với độ lệch của từng giá trị

    Cùng kiểu và giá trị.

  • JSON (21c), and CLOB holding JSON

    nvarchar(max)

    Cùng các giá trị JSON; NULL của SQL mà bản xuất ghi thành 'null' vẫn là NULL.

  • BLOB, RAW(n), LONG RAW

    binary(n), varbinary(n) và varbinary(max)

    Byte vẫn là byte.

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    nvarchar(max), và xml cho XMLTYPE

    Các kiểu riêng của Oracle không có kiểu tương đương; giá trị của chúng giữ văn bản, kể cả giá trị ROWID, dù chúng không có ý nghĩa ngoài Oracle.

  • collations that ignore case (BINARY_CI)

    cùng collation trên từng cột

    Các cột so sánh và sắp xếp như trước, và khóa duy nhất phân biệt đúng các hàng như cũ.

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

    IDENTITY, tiếp tục sau id lớn nhất

    Các id đã sao chép được nạp nguyên trạng, và bộ đếm tiếp tục sau id lớn nhất. Cột được trình kích hoạt điền từ sequence (cách làm trước 12c) cũng là cột identity.

  • identity columns the target can't count

    một số nguyên thường

    SQL Server đếm một cột IDENTITY mỗi bảng; cột khác giữ giá trị mà không có bộ đếm.

    Dòng báo cáo: counter_dropped

  • CREATE SEQUENCE

    CREATE SEQUENCE với cùng các tùy chọn

    Bản xuất ghi điểm sequence đã chạy đến làm START WITH của nó, nên nó tiếp tục từ đó.

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

    cột tính toán

    SQL Server tính chúng từ cùng công thức; giá trị mà bản xuất ghi cho chúng bị bỏ qua.

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

    một cột thường

    Công thức không viết được cho SQL Server để lại một cột thường và một dòng trong báo cáo; giá trị mà bản xuất ghi cho cột ảo bị bỏ qua, và SQL Server không có gì để tính.

    Dòng báo cáo: generated_not_translated

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

    không có giá trị mặc định

    Giá trị mặc định không viết được sẽ bị bỏ và được báo cáo.

    Dòng báo cáo: default_not_translated

  • CHECK constraints

    được chuyển đổi

    Cùng các ràng buộc kiểm tra, được kiểm tra khi từng hàng được nạp.

  • CHECK constraints with functions IntoSQL doesn't write

    không được tạo

    Ràng buộc kiểm tra không viết được sẽ bị bỏ và được báo cáo.

    Dòng báo cáo: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    không được tạo

    Oracle không áp dụng các ràng buộc kiểm tra này cho các hàng đã có sẵn, nên các hàng có thể vi phạm chúng.

    Dòng báo cáo: check_not_enforced

  • function-based, bitmap and domain indexes

    không được tạo

    IntoSQL ghi chỉ mục b-tree trên toàn bộ cột; hãy tạo lại các chỉ mục khác sau khi nạp.

    Dòng báo cáo: index_skipped

  • foreign keys

    sau dữ liệu với WITH NOCHECK, rồi kiểm tra kèm cảnh báo về hàng mồ côi

    Khóa được tạo sau các hàng và kiểm tra sau cùng; hàng không có hàng cha khiến khóa ở trạng thái chưa kiểm tra kèm cảnh báo thay vì dừng quá trình nạp.

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

    NO ACTION

    SQL Server từ chối cascade tạo vòng lặp hoặc đi theo đường thứ hai, nên khóa được tạo mà không có thao tác đó và báo cáo ghi rõ.

    Dòng báo cáo: foreign_key_action_dropped

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

    không được tạo

    Khóa không thể tham chiếu tới bảng không tồn tại, và khóa mà Oracle không kiểm tra có thể có hàng không có hàng cha.

    Dòng báo cáo: foreign_key_skipped

  • partitioned tables

    một bảng chứa các hàng của mọi phân vùng

    Các hàng giữ nguyên; hãy phân vùng lại bảng trong SQL Server nếu cần.

    Dòng báo cáo: partitions_dropped

  • NOT NULL columns with values that become NULL

    bỏ NOT NULL

    Cột có giá trị phải chuyển thành NULL không thể giữ NOT NULL, nếu không quá trình nạp sẽ dừng.

    Dòng báo cáo: not_null_relaxed

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

    được liệt kê trong báo cáo

    Mã của chúng viết bằng PL/SQL, nên được liệt kê để bạn tạo lại.

    Dòng báo cáo: not_converted_objects

  • exports without CREATE TABLE (data only)

    kiểu suy ra từ giá trị

    Bản xuất chỉ có dữ liệu thì chỉ có các hàng, nên kiểu được suy ra từ giá trị.

    Dòng báo cáo: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    Trình chuyển đổi không chạy cơ sở dữ liệu thì không tính được chúng; to_date, to_timestamp, TO_CLOB, HEXTORAW và các hàm khác mà bản xuất ghi thì vẫn được đọc.

    Dòng báo cáo: expression_value

  • types IntoSQL doesn't know, and object types

    nvarchar(max)

    Văn bản chứa được mọi giá trị; hãy đổi kiểu sau khi nạp.

    Dòng báo cáo: unknown_type

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

    NULL

    Giá trị không phải ngày sẽ thành NULL và báo cáo đếm nó.

    Dòng báo cáo: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    NULL

    Các kiểu số dấu phẩy động của SQL Server không có NaN hay vô cực, nên các giá trị đó trở thành NULL và báo cáo đếm số lượng.

    Dòng báo cáo: invalid_value_null

  • NUL characters in text

    được giữ

    nvarchar chứa được ký tự NUL, nên giá trị được sao chép nguyên trạng.

  • text that isn't valid in its encoding

    byte lỗi thành ký tự thay thế

    Tập lệnh là UTF-8 và mọi giá trị phải là văn bản hợp lệ.

    Dòng báo cáo: invalid_utf8_replaced

  • text decoded twice (ñ)

    sao chép nguyên trạng

    Tập lệnh chứa đúng các ký tự này, nên chúng được sao chép; báo cáo chỉ ra chúng.

    Dòng báo cáo: mojibake_suspected

Trong OracleTrong SQL ServerDòng báo cáo
BOOLEAN (23ai)bitSQL Server không có cột boolean, nên TRUE và FALSE là 1 và 0.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGnvarchar(n), nchar(n) và nvarchar(max)Độ dài đếm theo ký tự, dù Oracle đếm theo byte hay ký tự, nên mọi giá trị đều vừa.
VARCHAR2 and NVARCHAR2 past what the target's own types holdnvarchar(2n), hoặc nvarchar(max) khi vượt 4000nvarchar đếm theo đơn vị UTF-16 và một emoji chiếm hai đơn vị, nên cột được cấp đủ chỗ cho mọi giá trị.text_length_widened
NUMBER, NUMBER(p,s), FLOAT(b)decimal(p,s), hoặc bigintNUMBER giữ mọi chữ số; NUMBER không có độ chính xác mà mọi giá trị đều là số nguyên tối đa 18 chữ số sẽ thành số nguyên 64 bit, còn thang số âm chứa đủ bấy nhiêu chữ số trước dấu thập phân.
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECONDnvarchar(100) với văn bản của Oracle, ví dụ +01-06SQL Server không có kiểu interval; văn bản giữ mọi phần.type_replaced
DATE, TIMESTAMP(p)datetime2(p)DATE của Oracle chứa thời gian đến từng giây, nên nó là ngày và giờ. Bản xuất trong phiên kiểu Mỹ hoặc Đức ghi ngày mà không có giờ hay thế kỷ (DD-MON-RR); hãy xuất trong phiên ISO (SYYYY-MM-DD HH24:MI:SS) để giữ chúng.
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONEdatetimeoffset, với độ lệch của từng giá trịCùng kiểu và giá trị.
JSON (21c), and CLOB holding JSONnvarchar(max)Cùng các giá trị JSON; NULL của SQL mà bản xuất ghi thành 'null' vẫn là NULL.
BLOB, RAW(n), LONG RAWbinary(n), varbinary(n) và varbinary(max)Byte vẫn là byte.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYnvarchar(max), và xml cho XMLTYPECác kiểu riêng của Oracle không có kiểu tương đương; giá trị của chúng giữ văn bản, kể cả giá trị ROWID, dù chúng không có ý nghĩa ngoài Oracle.
collations that ignore case (BINARY_CI)cùng collation trên từng cộtCác cột so sánh và sắp xếp như trước, và khóa duy nhất phân biệt đúng các hàng như cũ.
identity columns, and a sequence a BEFORE INSERT trigger assignsIDENTITY, tiếp tục sau id lớn nhấtCác id đã sao chép được nạp nguyên trạng, và bộ đếm tiếp tục sau id lớn nhất. Cột được trình kích hoạt điền từ sequence (cách làm trước 12c) cũng là cột identity.
identity columns the target can't countmột số nguyên thườngSQL Server đếm một cột IDENTITY mỗi bảng; cột khác giữ giá trị mà không có bộ đếm.counter_dropped
CREATE SEQUENCECREATE SEQUENCE với cùng các tùy chọnBản xuất ghi điểm sequence đã chạy đến làm START WITH của nó, nên nó tiếp tục từ đó.
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)cột tính toánSQL Server tính chúng từ cùng công thức; giá trị mà bản xuất ghi cho chúng bị bỏ qua.
virtual columns with functions IntoSQL doesn't write, and the || operatormột cột thườngCông thức không viết được cho SQL Server để lại một cột thường và một dòng trong báo cáo; giá trị mà bản xuất ghi cho cột ảo bị bỏ qua, và SQL Server không có gì để tính.generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)không có giá trị mặc địnhGiá trị mặc định không viết được sẽ bị bỏ và được báo cáo.default_not_translated
CHECK constraintsđược chuyển đổiCùng các ràng buộc kiểm tra, được kiểm tra khi từng hàng được nạp.
CHECK constraints with functions IntoSQL doesn't writekhông được tạoRàng buộc kiểm tra không viết được sẽ bị bỏ và được báo cáo.check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATEkhông được tạoOracle không áp dụng các ràng buộc kiểm tra này cho các hàng đã có sẵn, nên các hàng có thể vi phạm chúng.check_not_enforced
function-based, bitmap and domain indexeskhông được tạoIntoSQL ghi chỉ mục b-tree trên toàn bộ cột; hãy tạo lại các chỉ mục khác sau khi nạp.index_skipped
foreign keyssau dữ liệu với WITH NOCHECK, rồi kiểm tra kèm cảnh báo về hàng mồ côiKhóa được tạo sau các hàng và kiểm tra sau cùng; hàng không có hàng cha khiến khóa ở trạng thái chưa kiểm tra kèm cảnh báo thay vì dừng quá trình nạp.
ON DELETE CASCADE that cascades in a cycle or along a second pathNO ACTIONSQL Server từ chối cascade tạo vòng lặp hoặc đi theo đường thứ hai, nên khóa được tạo mà không có thao tác đó và báo cáo ghi rõ.foreign_key_action_dropped
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE oneskhông được tạoKhóa không thể tham chiếu tới bảng không tồn tại, và khóa mà Oracle không kiểm tra có thể có hàng không có hàng cha.foreign_key_skipped
partitioned tablesmột bảng chứa các hàng của mọi phân vùngCác hàng giữ nguyên; hãy phân vùng lại bảng trong SQL Server nếu cần.partitions_dropped
NOT NULL columns with values that become NULLbỏ NOT NULLCột có giá trị phải chuyển thành NULL không thể giữ NOT NULL, nếu không quá trình nạp sẽ dừng.not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggersđược liệt kê trong báo cáoMã của chúng viết bằng PL/SQL, nên được liệt kê để bạn tạo lại.not_converted_objects
exports without CREATE TABLE (data only)kiểu suy ra từ giá trịBản xuất chỉ có dữ liệu thì chỉ có các hàng, nên kiểu được suy ra từ giá trị.no_schema
expressions in INSERT values other than the ones exports writeNULLTrình chuyển đổi không chạy cơ sở dữ liệu thì không tính được chúng; to_date, to_timestamp, TO_CLOB, HEXTORAW và các hàm khác mà bản xuất ghi thì vẫn được đọc.expression_value
types IntoSQL doesn't know, and object typesnvarchar(max)Văn bản chứa được mọi giá trị; hãy đổi kiểu sau khi nạp.unknown_type
dates before year 1 and time zones given as region namesNULLGiá trị không phải ngày sẽ thành NULL và báo cáo đếm nó.date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLENULLCác kiểu số dấu phẩy động của SQL Server không có NaN hay vô cực, nên các giá trị đó trở thành NULL và báo cáo đếm số lượng.invalid_value_null
NUL characters in textđược giữnvarchar chứa được ký tự NUL, nên giá trị được sao chép nguyên trạng.
text that isn't valid in its encodingbyte lỗi thành ký tự thay thếTập lệnh là UTF-8 và mọi giá trị phải là văn bản hợp lệ.invalid_utf8_replaced
text decoded twice (ñ)sao chép nguyên trạngTập lệnh chứa đúng các ký tự này, nên chúng được sao chép; báo cáo chỉ ra chúng.mojibake_suspected

Nạp tập lệnh vào SQL Server

Tập lệnh tạo bảng, sao chép các hàng, rồi thêm khóa, chỉ mục và khóa ngoại, nên nạp nhanh và dừng ở lỗi đầu tiên.

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

Khóa ngoại được thêm với WITH NOCHECK rồi được kiểm tra. Nếu một hàng trỏ tới hàng không tồn tại, tập lệnh cho biết ràng buộc nào và để nó ở trạng thái chưa kiểm tra, thay vì thất bại giữa chừng.

Với bản dump lớn, hãy chạy sqlcmd trên cùng máy với máy chủ. Mỗi lô tối đa 1000 hàng được commit riêng, nên nhật ký giao dịch luôn nhỏ.

Tạo bản dump Oracle để có kết quả tốt nhất

Trình chuyển đổi đọc những gì bản dump chứa. Các tùy chọn sau giữ lại nhiều dữ liệu hơn trong đó:

  • Trong SQL Developer, chọn Tools, Database Export, với DDL và định dạng dữ liệu Insert. SQLcl ghi ra cùng nội dung với SET SQLFORMAT INSERT.
  • Chạy ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' trước khi xuất: định dạng mặc định ghi ngày mà không có giờ hay thế kỷ.
  • Tệp .dmp từ exp hoặc expdp là nhị phân: hãy nhập nó vào một cơ sở dữ liệu Oracle, chẳng hạn Oracle Database Free trong Docker, rồi xuất bằng SQL Developer.

Những gì không được chuyển đổi

Khung nhìn, gói, thủ tục, hàm, trình kích hoạt, kiểu và từ đồng nghĩa được viết bằng PL/SQL. Chúng được liệt kê theo tên trong báo cáo, không bao giờ bị bỏ âm thầm, để bạn viết lại cho SQL Server.

Câu hỏi về Oracle sang SQL Server

Chưa có câu trả lời ở đây? Hãy viết cho chúng tôi từ trang liên hệ, sẽ có người trả lời. Trang liên hệ

Bản dump của tôi có bị tải lên không?

Không. Trình chuyển đổi chạy trong trình duyệt và đọc bản dump từ ổ đĩa theo từng phần, nên nó không bao giờ rời khỏi máy tính của bạn. Ứng dụng máy tính và dòng lệnh cũng chuyển đổi ngay trên máy tính của bạn.

Bản dump có thể lớn đến đâu?

Trình chuyển đổi không bao giờ giữ toàn bộ bản dump trong bộ nhớ: nó đọc tệp hai lần, theo từng đoạn, và ghi tập lệnh trong lúc đọc. Bản dump nhiều gigabyte vẫn chuyển đổi được trong trình duyệt, trong ứng dụng máy tính và bằng dòng lệnh.

Tôi có chuyển đổi được tệp .dmp từ exp hoặc expdp không?

Không trực tiếp: Data Pump và Export gốc ghi một định dạng nhị phân mà chỉ Oracle đọc được. Hãy nhập nó vào bất kỳ cơ sở dữ liệu Oracle nào, Oracle Database Free chạy trong Docker, rồi xuất bằng Database Export của SQL Developer hoặc SQLcl. Trình chuyển đổi sẽ báo điều này khi nhận được tệp .dmp.

Bản xuất có thể đến từ những phiên bản Oracle nào?

Bản xuất từ SQL Developer và SQLcl, với định nghĩa bảng của DBMS_METADATA, từ Oracle 11g trở lên. Mọi bản xuất thử nghiệm đến từ Oracle 21c và 23ai, trong các phiên kiểu Mỹ, Đức và ISO, và được so với nguồn từng ô một.

NUMBER, DATE và các kiểu Oracle khác sẽ ra sao?

NUMBER thành decimal, hoặc bigint cho số nguyên; DATE thành datetime2(0), giữ nguyên giờ; văn bản thành nvarchar, so sánh chính xác như trong Oracle; CLOB thành nvarchar(max), BLOB thành varbinary(max). NaN và Infinity thành NULL và báo cáo đếm chúng.

Cột identity và sequence có được giữ không?

Có. Cột identity thành cột IDENTITY và tiếp tục sau id lớn nhất; sequence thành sequence của SQL Server, và giá trị mặc định lấy từ một sequence vẫn tiếp tục lấy từ nó.

Còn gói PL/SQL, thủ tục và trình kích hoạt thì sao?

Chúng được liệt kê theo tên trong báo cáo và không được chuyển đổi, vì mỗi cơ sở dữ liệu viết chúng bằng ngôn ngữ riêng.

Tập lệnh nạp được trên những phiên bản SQL Server nào?

SQL Server 2017 đến 2025. Cùng một tập lệnh nạp được trên từng phiên bản, và dừng ở lỗi đầu tiên nếu có sự cố.