本文へスキップ
IntoSQL ホーム

Oracle を SQL Server に変換

SQL Developer の Database Export または SQLcl が書き出した、テーブルと Insert 文を含む .sql ファイルをドロップすると、同じテーブル、キー、インデックス、データを持つ SQL Server スクリプトをダウンロードできます。SQL Server がそのまま保持できない値と、引き継がないオブジェクトは、すべてレポートに記載されます。

ファイル
sqlshop_2024_oracle.sqlサンプルファイル、9.3 KB
データベース

18 行を変換、修正 2 件、却下なし

表示

shop_2024_oracle.sql のテーブルOracle のダンプ · SQL Developer で作成 · utf-8

  • customers8 行1
    7 列
    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 行1
    9 列
    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

修正

  1. customers の "name" には絵文字など SQL Server が 2 文字と数える文字があるため、nvarchar(200) にしました。
  2. orders の "note" には絵文字など SQL Server が 2 文字と数える文字があるため、nvarchar(510) にしました。

ファイルはこのコンピューター上で変換され、アップロードされることはありません。

その他のサンプル:

Oracle から SQL Server で変わること

各行はコンバーターが適用するルールです。ルールによってデータが変わったときにレポートに書かれる行も示します。

  • BOOLEAN (23ai)

    bit

    SQL Server には boolean 列がないため、TRUE と FALSE は 1 と 0 になります。

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

    nvarchar(n)、nchar(n)、nvarchar(max)

    Oracle がバイトと文字のどちらで数えていても、長さは文字数で数えるため、すべての値が収まります。

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

    nvarchar(2n)、4000 を超えると nvarchar(max)

    nvarchar は UTF-16 単位で数え、絵文字は 2 単位を使うため、すべての値が収まる長さにします。

    レポートの行: text_length_widened

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

    decimal(p,s)、または bigint

    NUMBER はすべての桁を保ちます。精度のない NUMBER で値がすべて 18 桁以内の整数なら 64 ビット整数になり、負のスケールはその桁数を小数点の前に確保します。

  • INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND

    Oracle のテキスト (+01-06 など) を持つ nvarchar(100)

    SQL Server には interval 型がありません。テキストならすべての部分を保てます。

    レポートの行: type_replaced

  • DATE, TIMESTAMP(p)

    datetime2(p)

    Oracle の DATE は秒までの時刻を持つため、日付と時刻になります。アメリカ式やドイツ式のセッションでのエクスポートは、日付を時刻や世紀なしで書き出します (DD-MON-RR)。これらを保つには ISO のセッション (SYYYY-MM-DD HH24:MI:SS) でエクスポートしてください。

  • TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE

    datetimeoffset、各値のオフセット付き

    同じ型と値です。

  • JSON (21c), and CLOB holding JSON

    nvarchar(max)

    JSON の値は同じです。エクスポートが 'null' と書き出した SQL の NULL は NULL のままです。

  • BLOB, RAW(n), LONG RAW

    binary(n)、varbinary(n)、varbinary(max)

    バイトはバイトのままです。

  • ROWID, UROWID, XMLTYPE, SDO_GEOMETRY

    nvarchar(max)、XMLTYPE は xml

    Oracle 独自の型には同等の型がありません。値はテキストを保ち、ROWID の値も含まれますが、Oracle の外では意味を持ちません。

  • collations that ignore case (BINARY_CI)

    各列で同じ照合順序

    列は以前と同じように比較・並べ替えされ、一意キーも同じ行を区別します。

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

    IDENTITY、最大の ID の後から継続

    コピーした ID はそのまま読み込み、カウンターは最大の ID の後から続きます。トリガーがシーケンスから値を入れる列 (12c より前の方法) も IDENTITY 列になります。

  • identity columns the target can't count

    普通の整数

    SQL Server が採番する IDENTITY 列はテーブルごとに 1 つだけです。それ以外の列はカウンターなしで値を保ちます。

    レポートの行: counter_dropped

  • CREATE SEQUENCE

    同じオプションの CREATE SEQUENCE

    エクスポートはシーケンスの現在位置を START WITH として書き出すため、そこから続きます。

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

    計算列

    SQL Server は同じ式から計算します。エクスポートがこれらの列に書き出した値は含めません。

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

    普通の列

    SQL Server 用に書き換えられない式は、普通の列とレポートの 1 行になります。エクスポートが仮想列に書き出した値は含めず、SQL Server が計算する値もありません。

    レポートの行: generated_not_translated

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

    デフォルト値なし

    書き換えられないデフォルト値は含めず、レポートに記載します。

    レポートの行: default_not_translated

  • CHECK constraints

    変換済み

    チェック制約は同じで、各行の読み込み時に検証します。

  • CHECK constraints with functions IntoSQL doesn't write

    作成しない

    書き換えられないチェック制約は含めず、レポートに記載します。

    レポートの行: check_skipped

  • CHECK constraints that are DISABLE or ENABLE NOVALIDATE

    作成しない

    Oracle は既存の行にこれらのチェックを適用しないため、行が違反している可能性があります。

    レポートの行: check_not_enforced

  • function-based, bitmap and domain indexes

    作成しない

    IntoSQL が書き出すのは列全体に対する b-tree インデックスです。その他は読み込み後に作り直してください。

    レポートの行: index_skipped

  • foreign keys

    データの後に WITH NOCHECK で作成してからチェックし、孤立した行があれば警告

    キーは行の後に作成し、最後にチェックします。親のない行があれば、読み込みを止めずにキーを未チェックのまま残して警告します。

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

    NO ACTION

    SQL Server はループするカスケードや 2 つ目の経路をたどるカスケードを拒否するため、キーはその動作なしで作成し、レポートに記載します。

    レポートの行: foreign_key_action_dropped

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

    作成しない

    キーは存在しないテーブルを参照できません。また、Oracle がチェックしないキーには親のない行がある可能性があります。

    レポートの行: foreign_key_skipped

  • partitioned tables

    すべてのパーティションの行を持つ 1 つのテーブル

    行は同じです。必要なら SQL Server でもう一度テーブルをパーティション分割してください。

    レポートの行: partitions_dropped

  • NOT NULL columns with values that become NULL

    NOT NULL を削除

    値を NULL にする必要があった列は NOT NULL を保てません。保つと読み込みが止まります。

    レポートの行: not_null_relaxed

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

    レポートに記載

    コードが PL/SQL で書かれているため、作り直せるよう一覧にします。

    レポートの行: not_converted_objects

  • exports without CREATE TABLE (data only)

    値から読み取った型

    データのみのエクスポートには行しかないため、型は値から決まります。

    レポートの行: no_schema

  • expressions in INSERT values other than the ones exports write

    NULL

    データベースを実行しないコンバーターでは、これらを評価できません。エクスポートが書き出す to_date、to_timestamp、TO_CLOB、HEXTORAW などは読み取ります。

    レポートの行: expression_value

  • types IntoSQL doesn't know, and object types

    nvarchar(max)

    text はどんな値も保持できます。読み込み後に型を変更してください。

    レポートの行: unknown_type

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

    NULL

    日付ではない値は NULL になり、レポートで件数を示します。

    レポートの行: date_out_of_range

  • NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE

    NULL

    SQL Server の浮動小数点型には NaN や infinity がないため、それらの値は NULL になり、レポートで件数を示します。

    レポートの行: invalid_value_null

  • NUL characters in text

    保持

    nvarchar は NUL 文字を保持できるため、値はそのままコピーします。

  • text that isn't valid in its encoding

    不正なバイトを置換文字に

    スクリプトは UTF-8 なので、すべての値が有効なテキストである必要があります。

    レポートの行: invalid_utf8_replaced

  • text decoded twice (ñ)

    そのままコピー

    スクリプトにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。

    レポートの行: mojibake_suspected

Oracle ではSQL Server ではレポートの行
BOOLEAN (23ai)bitSQL Server には boolean 列がないため、TRUE と FALSE は 1 と 0 になります。
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONGnvarchar(n)、nchar(n)、nvarchar(max)Oracle がバイトと文字のどちらで数えていても、長さは文字数で数えるため、すべての値が収まります。
VARCHAR2 and NVARCHAR2 past what the target's own types holdnvarchar(2n)、4000 を超えると nvarchar(max)nvarchar は UTF-16 単位で数え、絵文字は 2 単位を使うため、すべての値が収まる長さにします。text_length_widened
NUMBER, NUMBER(p,s), FLOAT(b)decimal(p,s)、または bigintNUMBER はすべての桁を保ちます。精度のない NUMBER で値がすべて 18 桁以内の整数なら 64 ビット整数になり、負のスケールはその桁数を小数点の前に確保します。
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECONDOracle のテキスト (+01-06 など) を持つ nvarchar(100)SQL Server には interval 型がありません。テキストならすべての部分を保てます。type_replaced
DATE, TIMESTAMP(p)datetime2(p)Oracle の DATE は秒までの時刻を持つため、日付と時刻になります。アメリカ式やドイツ式のセッションでのエクスポートは、日付を時刻や世紀なしで書き出します (DD-MON-RR)。これらを保つには ISO のセッション (SYYYY-MM-DD HH24:MI:SS) でエクスポートしてください。
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONEdatetimeoffset、各値のオフセット付き同じ型と値です。
JSON (21c), and CLOB holding JSONnvarchar(max)JSON の値は同じです。エクスポートが 'null' と書き出した SQL の NULL は NULL のままです。
BLOB, RAW(n), LONG RAWbinary(n)、varbinary(n)、varbinary(max)バイトはバイトのままです。
ROWID, UROWID, XMLTYPE, SDO_GEOMETRYnvarchar(max)、XMLTYPE は xmlOracle 独自の型には同等の型がありません。値はテキストを保ち、ROWID の値も含まれますが、Oracle の外では意味を持ちません。
collations that ignore case (BINARY_CI)各列で同じ照合順序列は以前と同じように比較・並べ替えされ、一意キーも同じ行を区別します。
identity columns, and a sequence a BEFORE INSERT trigger assignsIDENTITY、最大の ID の後から継続コピーした ID はそのまま読み込み、カウンターは最大の ID の後から続きます。トリガーがシーケンスから値を入れる列 (12c より前の方法) も IDENTITY 列になります。
identity columns the target can't count普通の整数SQL Server が採番する IDENTITY 列はテーブルごとに 1 つだけです。それ以外の列はカウンターなしで値を保ちます。counter_dropped
CREATE SEQUENCE同じオプションの CREATE SEQUENCEエクスポートはシーケンスの現在位置を START WITH として書き出すため、そこから続きます。
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)計算列SQL Server は同じ式から計算します。エクスポートがこれらの列に書き出した値は含めません。
virtual columns with functions IntoSQL doesn't write, and the || operator普通の列SQL Server 用に書き換えられない式は、普通の列とレポートの 1 行になります。エクスポートが仮想列に書き出した値は含めず、SQL Server が計算する値もありません。generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)デフォルト値なし書き換えられないデフォルト値は含めず、レポートに記載します。default_not_translated
CHECK constraints変換済みチェック制約は同じで、各行の読み込み時に検証します。
CHECK constraints with functions IntoSQL doesn't write作成しない書き換えられないチェック制約は含めず、レポートに記載します。check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATE作成しないOracle は既存の行にこれらのチェックを適用しないため、行が違反している可能性があります。check_not_enforced
function-based, bitmap and domain indexes作成しないIntoSQL が書き出すのは列全体に対する b-tree インデックスです。その他は読み込み後に作り直してください。index_skipped
foreign keysデータの後に WITH NOCHECK で作成してからチェックし、孤立した行があれば警告キーは行の後に作成し、最後にチェックします。親のない行があれば、読み込みを止めずにキーを未チェックのまま残して警告します。
ON DELETE CASCADE that cascades in a cycle or along a second pathNO ACTIONSQL Server はループするカスケードや 2 つ目の経路をたどるカスケードを拒否するため、キーはその動作なしで作成し、レポートに記載します。foreign_key_action_dropped
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones作成しないキーは存在しないテーブルを参照できません。また、Oracle がチェックしないキーには親のない行がある可能性があります。foreign_key_skipped
partitioned tablesすべてのパーティションの行を持つ 1 つのテーブル行は同じです。必要なら SQL Server でもう一度テーブルをパーティション分割してください。partitions_dropped
NOT NULL columns with values that become NULLNOT NULL を削除値を NULL にする必要があった列は NOT NULL を保てません。保つと読み込みが止まります。not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggersレポートに記載コードが PL/SQL で書かれているため、作り直せるよう一覧にします。not_converted_objects
exports without CREATE TABLE (data only)値から読み取った型データのみのエクスポートには行しかないため、型は値から決まります。no_schema
expressions in INSERT values other than the ones exports writeNULLデータベースを実行しないコンバーターでは、これらを評価できません。エクスポートが書き出す to_date、to_timestamp、TO_CLOB、HEXTORAW などは読み取ります。expression_value
types IntoSQL doesn't know, and object typesnvarchar(max)text はどんな値も保持できます。読み込み後に型を変更してください。unknown_type
dates before year 1 and time zones given as region namesNULL日付ではない値は NULL になり、レポートで件数を示します。date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLENULLSQL Server の浮動小数点型には NaN や infinity がないため、それらの値は NULL になり、レポートで件数を示します。invalid_value_null
NUL characters in text保持nvarchar は NUL 文字を保持できるため、値はそのままコピーします。
text that isn't valid in its encoding不正なバイトを置換文字にスクリプトは UTF-8 なので、すべての値が有効なテキストである必要があります。invalid_utf8_replaced
text decoded twice (ñ)そのままコピースクリプトにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。mojibake_suspected

スクリプトを SQL Server に読み込む

スクリプトはテーブルを作成して行をコピーしてから、キー、インデックス、外部キーを追加します。そのため読み込みが速く、最初のエラーで止まります。

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

外部キーは WITH NOCHECK で追加してからチェックします。存在しない行を参照している行があれば、途中で失敗する代わりに、どの制約かをスクリプトが示し、その制約は未チェックのまま残します。

大きなダンプでは、サーバーと同じマシンで sqlcmd を実行してください。最大 1000 行のバッチごとにコミットするため、トランザクションログは小さいままです。

Oracle を最適な方法でダンプする

コンバーターはダンプの内容を読み取ります。次のオプションを使うと、より多くのデータがダンプに残ります。

  • SQL Developer で Tools、Database Export を選び、DDL と Insert データ形式を指定します。SQLcl では SET SQLFORMAT INSERT で同じものを書き出せます。
  • エクスポートの前に ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' を実行してください。デフォルトの形式では日付が時刻や世紀なしで書き出されます。
  • exp や expdp の .dmp ファイルはバイナリです。Oracle データベース (たとえば Docker 上の Oracle Database Free) にインポートし、SQL Developer でエクスポートしてください。

変換されないもの

ビュー、パッケージ、プロシージャ、関数、トリガー、型、シノニムは PL/SQL で書かれています。黙って削除することはなく、レポートに名前で一覧するので、SQL Server 向けに書き直せます。

Oracle から SQL Server への変換に関する質問

ここに答えがない場合は、お問い合わせページからご連絡ください。担当者が返信します。 お問い合わせページ

ダンプはアップロードされますか?

いいえ。コンバーターはブラウザ上で動作し、ダンプをディスクから少しずつ読み込むため、ダンプがコンピューターの外に出ることはありません。デスクトップアプリとコマンドラインも、お使いのコンピューター上で変換します。

ダンプはどのくらいの大きさまで扱えますか?

コンバーターはダンプ全体をメモリに保持しません。ファイルを範囲ごとに 2 回読み、読みながらスクリプトを書き出します。数 GB のダンプも、ブラウザ、デスクトップアプリ、コマンドラインで変換できます。

exp や expdp の .dmp ファイルは変換できますか?

直接はできません。Data Pump と従来の Export は Oracle だけが読めるバイナリ形式で書き出します。任意の Oracle データベース (Oracle Database Free は Docker で動きます) にインポートし、SQL Developer の Database Export または SQLcl でエクスポートしてください。.dmp ファイルを受け取ると、コンバーターがその旨を表示します。

どの Oracle バージョンのエクスポートに対応していますか?

Oracle 11g 以降から SQL Developer と SQLcl で書き出した、DBMS_METADATA のテーブル定義を含むエクスポートです。すべてのテスト用エクスポートは Oracle 21c と 23ai でアメリカ式、ドイツ式、ISO のセッションから作成し、ソースとセル単位で比較しています。

NUMBER、DATE などの Oracle の型はどうなりますか?

NUMBER は decimal に、整数なら bigint になります。DATE は時刻を保ったまま datetime2(0) に、テキストは Oracle と同じく厳密に比較する nvarchar、CLOB は nvarchar(max)、BLOB は varbinary(max) になります。NaN と Infinity は NULL になり、レポートで件数を示します。

IDENTITY 列とシーケンスは保たれますか?

はい。IDENTITY 列は IDENTITY 列になり、最大の ID の後から続きます。シーケンスは SQL Server のシーケンスになり、シーケンスを使うデフォルト値もそのまま使い続けます。

PL/SQL のパッケージ、プロシージャ、トリガーはどうなりますか?

データベースごとに独自の言語で書かれるため、変換はせず、レポートに名前で一覧します。

スクリプトはどの SQL Server バージョンで読み込めますか?

SQL Server 2017 から 2025 です。どのバージョンでも同じスクリプトを読み込め、問題があれば最初のエラーで止まります。