Converta Oracle para SQL Server
Solte o arquivo .sql que o Database Export do SQL Developer ou o SQLcl escreve, com suas tabelas e instruções Insert, e baixe um script do SQL Server com as mesmas tabelas, chaves, índices e dados. Cada valor que o SQL Server não aceita como está, e cada objeto que ele não traz, aparece no relatório.
18 linhas convertidas, 2 correções, nenhuma rejeitada
Tabelas em shop_2024_oracle.sqlDump do Oracle · gerado por SQL Developer · utf-8
customers8 linhas1
7 colunas 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 linhas1
9 colunas 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
Correções
- "name" de customers contém caracteres que o SQL Server conta em dobro, como emoji, então vira nvarchar(200).
- "note" de orders contém caracteres que o SQL Server conta em dobro, como emoji, então vira nvarchar(510).
Seu arquivo é convertido neste computador e nunca é enviado.
Outros exemplos:
O que muda do Oracle para o SQL Server
Cada linha é uma regra que o conversor aplica, com a linha do relatório que ele escreve quando a regra muda algo nos seus dados.
BOOLEAN (23ai)
bit
O SQL Server não tem coluna booleana, então TRUE e FALSE são 1 e 0.
VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG
nvarchar(n), nchar(n) e nvarchar(max)
Os tamanhos contam caracteres, quer o Oracle contasse bytes ou caracteres, então todo valor cabe.
VARCHAR2 and NVARCHAR2 past what the target's own types hold
nvarchar(2n), ou nvarchar(max) acima de 4000
nvarchar conta unidades UTF-16 e um emoji ocupa duas, então a coluna ganha espaço para todo valor.
Linha do relatório: text_length_widened
NUMBER, NUMBER(p,s), FLOAT(b)
decimal(p,s), ou bigint
NUMBER mantém cada dígito; um NUMBER sem precisão cujos valores são todos números inteiros de até 18 dígitos vira um inteiro de 64 bits, e uma escala negativa comporta outros tantos dígitos antes do ponto.
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND
nvarchar(100) com o texto do Oracle, como +01-06
O SQL Server não tem tipo interval; o texto mantém cada parte.
Linha do relatório: type_replaced
DATE, TIMESTAMP(p)
datetime2(p)
O DATE do Oracle guarda uma hora até o segundo, então é uma data e hora. Uma exportação em uma sessão americana ou alemã escreve as datas sem a hora nem o século (DD-MON-RR); exporte em uma sessão ISO (SYYYY-MM-DD HH24:MI:SS) para mantê-las.
TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE
datetimeoffset, com o fuso de cada valor
O mesmo tipo e os mesmos valores.
JSON (21c), and CLOB holding JSON
nvarchar(max)
Os mesmos valores JSON; um NULL do SQL que a exportação escreveu como 'null' continua NULL.
BLOB, RAW(n), LONG RAW
binary(n), varbinary(n) e varbinary(max)
Bytes continuam bytes.
ROWID, UROWID, XMLTYPE, SDO_GEOMETRY
nvarchar(max), e xml para XMLTYPE
Os tipos próprios do Oracle não têm equivalente; seus valores mantêm o texto, incluindo os valores ROWID, embora fora do Oracle não signifiquem nada.
collations that ignore case (BINARY_CI)
a mesma collation em cada coluna
As colunas comparam e ordenam como antes, e as chaves únicas mantêm as mesmas linhas separadas.
identity columns, and a sequence a BEFORE INSERT trigger assigns
IDENTITY, continuando depois do maior id
Os ids copiados carregam como estão, e o contador continua depois do maior deles. Uma coluna que um gatilho preenche a partir de uma sequência (o jeito de antes do 12c) também é de identidade.
identity columns the target can't count
um inteiro simples
O SQL Server conta uma coluna IDENTITY por tabela; qualquer outra mantém seus valores sem contador.
Linha do relatório: counter_dropped
CREATE SEQUENCE
CREATE SEQUENCE com as mesmas opções
A exportação escreve até onde uma sequência chegou como o seu START WITH, então ela continua dali.
virtual columns (GENERATED ALWAYS AS ... VIRTUAL)
colunas computadas
O SQL Server as calcula com a mesma fórmula; os valores que a exportação escreveu para elas ficam de fora.
virtual columns with functions IntoSQL doesn't write, and the || operator
uma coluna simples
Uma fórmula que não pode ser escrita para o SQL Server deixa uma coluna simples e uma linha no relatório; os valores que a exportação escreveu para colunas virtuais ficam de fora, e o SQL Server não tem nenhum para calcular.
Linha do relatório: generated_not_translated
defaults with functions IntoSQL doesn't write (SYS_GUID(), ||)
sem valor padrão
Um valor padrão que não pode ser escrito fica de fora e é informado.
Linha do relatório: default_not_translated
CHECK constraints
traduzidos
Os mesmos CHECKs, testados à medida que cada linha carrega.
CHECK constraints with functions IntoSQL doesn't write
não criado
Um CHECK que não pode ser escrito fica de fora e é informado.
Linha do relatório: check_skipped
CHECK constraints that are DISABLE or ENABLE NOVALIDATE
não criado
O Oracle não aplica esses CHECKs às linhas que já existiam, então as linhas podem violá-los.
Linha do relatório: check_not_enforced
function-based, bitmap and domain indexes
não criado
O IntoSQL escreve índices b-tree sobre colunas inteiras; crie os outros de novo depois da carga.
Linha do relatório: index_skipped
foreign keys
depois dos dados WITH NOCHECK, e então verificada com um aviso sobre órfãos
A chave é criada depois das linhas e verificada por último; linhas sem pai a deixam sem verificação com um aviso, em vez de parar a carga.
ON DELETE CASCADE that cascades in a cycle or along a second path
NO ACTION
O SQL Server recusa cascatas que formam um ciclo ou seguem um segundo caminho, então a chave é criada sem essa ação e o relatório a menciona.
Linha do relatório: foreign_key_action_dropped
foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones
não criada
Uma chave não pode apontar para uma tabela que não existe, e uma que o Oracle não verifica pode ter linhas sem pai.
Linha do relatório: foreign_key_skipped
partitioned tables
uma tabela com as linhas de todas as partições
As linhas são as mesmas; particione a tabela de novo no SQL Server se precisar.
Linha do relatório: partitions_dropped
NOT NULL columns with values that become NULL
NOT NULL removido
Uma coluna cujos valores tiveram de virar NULL não pode manter NOT NULL, senão a carga pararia.
Linha do relatório: not_null_relaxed
views, synonyms, types, packages, procedures, functions and other triggers
listados no relatório
O código deles é escrito em PL/SQL, então eles são listados para você recriá-los.
Linha do relatório: not_converted_objects
exports without CREATE TABLE (data only)
tipos lidos dos valores
Uma exportação só de dados tem apenas linhas, então os tipos vêm dos valores.
Linha do relatório: no_schema
expressions in INSERT values other than the ones exports write
NULL
Um conversor que não executa um banco de dados não consegue avaliá-las; to_date, to_timestamp, TO_CLOB, HEXTORAW e as outras que as exportações escrevem são lidas.
Linha do relatório: expression_value
types IntoSQL doesn't know, and object types
nvarchar(max)
O texto aceita qualquer valor; mude o tipo depois da carga.
Linha do relatório: unknown_type
dates before year 1 and time zones given as region names
NULL
Um valor que não é uma data vira NULL e o relatório o conta.
Linha do relatório: date_out_of_range
NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE
NULL
Os tipos de ponto flutuante do SQL Server não têm NaN nem infinito, então esses valores viram NULL e o relatório os conta.
Linha do relatório: invalid_value_null
NUL characters in text
mantido
nvarchar aceita o caractere NUL, então o valor é copiado como está.
text that isn't valid in its encoding
os bytes inválidos como o caractere de substituição
O script é UTF-8 e todo valor precisa ser texto válido.
Linha do relatório: invalid_utf8_replaced
text decoded twice (ñ)
copiado como está
O script contém exatamente esses caracteres, então eles são copiados; o relatório os aponta.
Linha do relatório: mojibake_suspected
| No Oracle | No SQL Server | Linha do relatório |
|---|---|---|
| BOOLEAN (23ai) | bitO SQL Server não tem coluna booleana, então TRUE e FALSE são 1 e 0. | |
| VARCHAR2(n BYTE|CHAR), NVARCHAR2(n), CHAR(n), NCHAR(n), CLOB, NCLOB, LONG | nvarchar(n), nchar(n) e nvarchar(max)Os tamanhos contam caracteres, quer o Oracle contasse bytes ou caracteres, então todo valor cabe. | |
| VARCHAR2 and NVARCHAR2 past what the target's own types hold | nvarchar(2n), ou nvarchar(max) acima de 4000nvarchar conta unidades UTF-16 e um emoji ocupa duas, então a coluna ganha espaço para todo valor. | text_length_widened |
| NUMBER, NUMBER(p,s), FLOAT(b) | decimal(p,s), ou bigintNUMBER mantém cada dígito; um NUMBER sem precisão cujos valores são todos números inteiros de até 18 dígitos vira um inteiro de 64 bits, e uma escala negativa comporta outros tantos dígitos antes do ponto. | |
| INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND | nvarchar(100) com o texto do Oracle, como +01-06O SQL Server não tem tipo interval; o texto mantém cada parte. | type_replaced |
| DATE, TIMESTAMP(p) | datetime2(p)O DATE do Oracle guarda uma hora até o segundo, então é uma data e hora. Uma exportação em uma sessão americana ou alemã escreve as datas sem a hora nem o século (DD-MON-RR); exporte em uma sessão ISO (SYYYY-MM-DD HH24:MI:SS) para mantê-las. | |
| TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE | datetimeoffset, com o fuso de cada valorO mesmo tipo e os mesmos valores. | |
| JSON (21c), and CLOB holding JSON | nvarchar(max)Os mesmos valores JSON; um NULL do SQL que a exportação escreveu como 'null' continua NULL. | |
| BLOB, RAW(n), LONG RAW | binary(n), varbinary(n) e varbinary(max)Bytes continuam bytes. | |
| ROWID, UROWID, XMLTYPE, SDO_GEOMETRY | nvarchar(max), e xml para XMLTYPEOs tipos próprios do Oracle não têm equivalente; seus valores mantêm o texto, incluindo os valores ROWID, embora fora do Oracle não signifiquem nada. | |
| collations that ignore case (BINARY_CI) | a mesma collation em cada colunaAs colunas comparam e ordenam como antes, e as chaves únicas mantêm as mesmas linhas separadas. | |
| identity columns, and a sequence a BEFORE INSERT trigger assigns | IDENTITY, continuando depois do maior idOs ids copiados carregam como estão, e o contador continua depois do maior deles. Uma coluna que um gatilho preenche a partir de uma sequência (o jeito de antes do 12c) também é de identidade. | |
| identity columns the target can't count | um inteiro simplesO SQL Server conta uma coluna IDENTITY por tabela; qualquer outra mantém seus valores sem contador. | counter_dropped |
| CREATE SEQUENCE | CREATE SEQUENCE com as mesmas opçõesA exportação escreve até onde uma sequência chegou como o seu START WITH, então ela continua dali. | |
| virtual columns (GENERATED ALWAYS AS ... VIRTUAL) | colunas computadasO SQL Server as calcula com a mesma fórmula; os valores que a exportação escreveu para elas ficam de fora. | |
| virtual columns with functions IntoSQL doesn't write, and the || operator | uma coluna simplesUma fórmula que não pode ser escrita para o SQL Server deixa uma coluna simples e uma linha no relatório; os valores que a exportação escreveu para colunas virtuais ficam de fora, e o SQL Server não tem nenhum para calcular. | generated_not_translated |
| defaults with functions IntoSQL doesn't write (SYS_GUID(), ||) | sem valor padrãoUm valor padrão que não pode ser escrito fica de fora e é informado. | default_not_translated |
| CHECK constraints | traduzidosOs mesmos CHECKs, testados à medida que cada linha carrega. | |
| CHECK constraints with functions IntoSQL doesn't write | não criadoUm CHECK que não pode ser escrito fica de fora e é informado. | check_skipped |
| CHECK constraints that are DISABLE or ENABLE NOVALIDATE | não criadoO Oracle não aplica esses CHECKs às linhas que já existiam, então as linhas podem violá-los. | check_not_enforced |
| function-based, bitmap and domain indexes | não criadoO IntoSQL escreve índices b-tree sobre colunas inteiras; crie os outros de novo depois da carga. | index_skipped |
| foreign keys | depois dos dados WITH NOCHECK, e então verificada com um aviso sobre órfãosA chave é criada depois das linhas e verificada por último; linhas sem pai a deixam sem verificação com um aviso, em vez de parar a carga. | |
| ON DELETE CASCADE that cascades in a cycle or along a second path | NO ACTIONO SQL Server recusa cascatas que formam um ciclo ou seguem um segundo caminho, então a chave é criada sem essa ação e o relatório a menciona. | foreign_key_action_dropped |
| foreign keys to tables the export doesn't create, and DISABLE or NOVALIDATE ones | não criadaUma chave não pode apontar para uma tabela que não existe, e uma que o Oracle não verifica pode ter linhas sem pai. | foreign_key_skipped |
| partitioned tables | uma tabela com as linhas de todas as partiçõesAs linhas são as mesmas; particione a tabela de novo no SQL Server se precisar. | partitions_dropped |
| NOT NULL columns with values that become NULL | NOT NULL removidoUma coluna cujos valores tiveram de virar NULL não pode manter NOT NULL, senão a carga pararia. | not_null_relaxed |
| views, synonyms, types, packages, procedures, functions and other triggers | listados no relatórioO código deles é escrito em PL/SQL, então eles são listados para você recriá-los. | not_converted_objects |
| exports without CREATE TABLE (data only) | tipos lidos dos valoresUma exportação só de dados tem apenas linhas, então os tipos vêm dos valores. | no_schema |
| expressions in INSERT values other than the ones exports write | NULLUm conversor que não executa um banco de dados não consegue avaliá-las; to_date, to_timestamp, TO_CLOB, HEXTORAW e as outras que as exportações escrevem são lidas. | expression_value |
| types IntoSQL doesn't know, and object types | nvarchar(max)O texto aceita qualquer valor; mude o tipo depois da carga. | unknown_type |
| dates before year 1 and time zones given as region names | NULLUm valor que não é uma data vira NULL e o relatório o conta. | date_out_of_range |
| NaN and Infinity in BINARY_FLOAT and BINARY_DOUBLE | NULLOs tipos de ponto flutuante do SQL Server não têm NaN nem infinito, então esses valores viram NULL e o relatório os conta. | invalid_value_null |
| NUL characters in text | mantidonvarchar aceita o caractere NUL, então o valor é copiado como está. | |
| text that isn't valid in its encoding | os bytes inválidos como o caractere de substituiçãoO script é UTF-8 e todo valor precisa ser texto válido. | invalid_utf8_replaced |
| text decoded twice (ñ) | copiado como estáO script contém exatamente esses caracteres, então eles são copiados; o relatório os aponta. | mojibake_suspected |
Carregue o script no SQL Server
O script cria as tabelas, copia as linhas e depois adiciona chaves, índices e chaves estrangeiras, então carrega rápido e para no primeiro erro.
sqlcmd -b -f 65001 -S localhost -d mydb -i oracle.sql_server.sqlAs chaves estrangeiras são adicionadas WITH NOCHECK e depois verificadas. Se uma linha aponta para uma linha que não existe, o script informa qual restrição e a deixa sem verificação, em vez de falhar no meio do caminho.
Para um dump grande, execute o sqlcmd na mesma máquina do servidor. Cada lote de até 1000 linhas faz commit sozinho, então o log de transações continua pequeno.
Gere o dump do Oracle para o melhor resultado
O conversor lê o que o dump contém. Estas opções mantêm mais dos seus dados nele:
- No SQL Developer, escolha Tools, Database Export, com DDL e o formato de dados Insert. O SQLcl escreve o mesmo com SET SQLFORMAT INSERT.
- Rode ALTER SESSION SET NLS_DATE_FORMAT = 'SYYYY-MM-DD HH24:MI:SS' antes de exportar: o formato padrão escreve as datas sem a hora nem o século.
- Um arquivo .dmp do exp ou do expdp é binário: importe-o em um banco de dados Oracle, como o Oracle Database Free no Docker, e exporte-o com o SQL Developer.
O que não é convertido
Visões, pacotes, procedimentos, funções, gatilhos, tipos e sinônimos são escritos em PL/SQL. Eles aparecem no relatório pelo nome, nunca são descartados em silêncio, para que você possa reescrevê-los para o SQL Server.
Perguntas sobre Oracle para SQL Server
Não encontrou a resposta? Escreva para nós pela página de contato e uma pessoa responde. Página de contato
Meu dump é enviado?
Não. O conversor roda no seu navegador e lê o dump do seu disco em partes, então ele nunca sai do seu computador. O app para desktop e a linha de comando também convertem no seu computador.
Qual o tamanho máximo do dump?
O conversor nunca guarda o dump inteiro na memória: ele lê o arquivo duas vezes, por intervalos, e escreve o script à medida que avança. Dumps de vários gigabytes são convertidos no navegador, no app para desktop e com a linha de comando.
Posso converter um arquivo .dmp do exp ou do expdp?
Não diretamente: o Data Pump e o Export original escrevem um formato binário que só o Oracle lê. Importe-o em qualquer banco de dados Oracle, o Oracle Database Free roda no Docker, e exporte-o com o Database Export do SQL Developer ou com o SQLcl. O conversor avisa quando recebe um arquivo .dmp.
De quais versões do Oracle a exportação pode vir?
Exportações do SQL Developer e do SQLcl, com as definições de tabela do DBMS_METADATA, a partir do Oracle 11g. Cada exportação de teste vem do Oracle 21c e 23ai, em sessões americanas, alemãs e ISO, e é comparada com a origem célula por célula.
O que acontece com NUMBER, DATE e os outros tipos do Oracle?
NUMBER vira decimal, ou bigint para números inteiros; DATE vira datetime2(0), mantendo a hora; texto nvarchar, comparado de forma exata como no Oracle; CLOB nvarchar(max), BLOB varbinary(max). NaN e Infinity viram NULL e o relatório os conta.
As colunas de identidade e as sequências são mantidas?
Sim. As colunas de identidade viram colunas IDENTITY e continuam depois do maior id; as sequências viram sequências do SQL Server, e os valores padrão que usam uma continuam usando.
E os pacotes, procedimentos e gatilhos em PL/SQL?
Eles aparecem no relatório pelo nome e não são convertidos, porque cada banco de dados os escreve na sua própria linguagem.
Em quais versões do SQL Server o script carrega?
SQL Server 2017 a 2025. O mesmo script carrega em cada uma delas e para no primeiro erro se algo der errado.