Pular para o conteúdo
Início do IntoSQL

Converta SQL Server para Oracle

Solte o script que o Generate Scripts do SSMS escreve com schema e dados, em .sql ou .sql.gz, UTF-16 ou UTF-8, e baixe um script do Oracle com as mesmas tabelas, chaves, índices e dados. Cada valor que o Oracle não aceita como está, e cada objeto que ele não traz, aparece no relatório.

Seu arquivo
sqlshop_2024_sqlserver.sqlArquivo de exemplo, 11 kB
Seu banco de dados

18 linhas convertidas, 2 correções, nenhuma rejeitada

Mostrar

Tabelas em shop_2024_sqlserver.sqlDump do SQL Server · gerado por SQL Server Management Objects · utf-8

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

Não convertidos

  • Visão paid_orders
  • Gatilho orders_no_negative

Cada banco de dados escreve estes objetos na sua própria linguagem. Reescreva-os para o Oracle.

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

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

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

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

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

Correções

  1. "total_with_tax" de orders é armazenada na origem; o Oracle a calcula na leitura.
  2. "row_version" de customers é uma versão de linha que o SQL Server define sozinho; o dump não tem valores para ela, então vira RAW(8) e fica vazia.

Para revisar

  • 6 colunas de texto comparam sem diferenciar maiúsculas na origem; o Oracle compara de forma exata, então chaves únicas e buscas podem se comportar de outro jeito. Use uma collation ou um tipo de coluna sem diferenciação de maiúsculas nas colunas que precisarem.
  • 2 visões, gatilhos, rotinas ou eventos não foram convertidos; o relatório lista cada um. Recrie-os manualmente no Oracle.
  • O CHECK check1 de orders não pode ser escrito para o Oracle (function isjson), então não é criado. Escreva o CHECK manualmente se ele for importante.
  • O índice idx_orders_pending de orders usa uma expressão que não pode ser escrita para o Oracle (filtered index), então não é criado. Crie o índice manualmente se as consultas precisarem dele.
  • O valor padrão de "order_ref" em orders não pode ser escrito para o Oracle (function uuid), então a coluna fica sem valor padrão. Adicione o valor padrão manualmente se novas linhas precisarem dele.

Seu arquivo é convertido neste computador e nunca é enviado.

Outros exemplos:

O que muda do SQL Server para o Oracle

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.

  • bit

    NUMBER(1) com um CHECK de 0 e 1

    O Oracle 21c não tem tipo de coluna booleano; 1 e 0 mantêm os valores em todas as versões.

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

    VARCHAR2(n CHAR), contando caracteres

    Os tamanhos contam caracteres, como o nvarchar do SQL Server.

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

    VARCHAR2(4000 CHAR) quando todo valor cabe em 4000 bytes, senão CLOB

    Um VARCHAR2 comporta 4000 bytes por padrão e o Oracle não indexa um CLOB, então o texto fica VARCHAR2 quando seus valores cabem e vira CLOB quando não cabem.

    Linha do relatório: text_as_lob

  • empty strings and empty binary values

    NULL

    O Oracle guarda uma string vazia como NULL, então um valor que era ' é lido como NULL. O relatório as conta por coluna.

    Linha do relatório: empty_string_null

  • decimal(p,s), money, smallmoney

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

    NUMBER comporta 38 dígitos, como decimal, então todo valor é exato.

  • datetime, datetime2, smalldatetime

    TIMESTAMP(p)

    Um datetime é a leitura de um relógio de parede, como o TIMESTAMP do Oracle, que guarda até nove dígitos de segundo. date vira DATE, que também guarda uma hora do dia, que fica em meia-noite.

  • datetimeoffset

    TIMESTAMP WITH TIME ZONE, com o fuso de cada valor

    O Oracle mantém os fusos de -12:00 a +14:00; um valor com fuso além de -12:00 é escrito em UTC, o mesmo instante.

  • time

    INTERVAL DAY TO SECOND desde a meia-noite

    O Oracle não tem tipo de hora do dia; um intervalo a partir da meia-noite guarda todo valor.

  • dates that aren't valid

    NULL

    Um valor que não é uma data vira NULL e o relatório o conta.

    Linha do relatório: date_out_of_range

  • json (SQL Server 2025)

    CLOB

    Os mesmos valores JSON, que as funções JSON do Oracle leem.

  • uniqueidentifier

    VARCHAR2(36)

    Os mesmos identificadores, escritos em minúsculas.

  • binary, varbinary, image

    RAW(n) e BLOB

    Bytes continuam sendo bytes.

  • geometry, geography

    BLOB com os bytes próprios do SQL Server

    O SSMS escreve valores espaciais na serialização do SQL Server, que é mantida byte a byte.

    Linha do relatório: spatial_as_native

  • rowversion, timestamp

    BLOB, sem valores

    O SQL Server define a versão de linha sozinho, e o SSMS não escreve valores para ela no script.

    Linha do relatório: rowversion_empty

  • xml, sql_variant, hierarchyid, vector

    VARCHAR2 ou CLOB com o texto de cada valor

    O Oracle não tem um tipo equivalente; xml e sql_variant mantêm o texto de cada valor e hierarchyid o seu caminho, como /1/2/.

    Linha do relatório: type_replaced

  • collations that ignore case (_CI_)

    comparação exata

    O Oracle compara texto de forma exata, a menos que se indique outra coisa, então colunas que ignoravam maiúsculas no SQL Server agora diferenciam Ana de ana.

    Linha do relatório: case_insensitive_collation

  • IDENTITY

    GENERATED BY DEFAULT ON NULL AS IDENTITY, continuando depois do maior id

    Os ids copiados carregam como estão, e o contador continua depois do maior deles.

  • CREATE SEQUENCE

    CREATE SEQUENCE com as mesmas opções

    As sequências do Oracle funcionam do mesmo jeito. O SSMS não escreve até onde uma sequência chegou, então ela começa onde foi criada.

  • computed columns

    colunas virtuais

    O Oracle só calcula colunas geradas na leitura; colunas PERSISTED viram virtuais com os mesmos valores.

    Linha do relatório: stored_as_virtual

  • computed columns with functions Oracle lacks

    uma coluna simples

    Uma fórmula que não pode ser escrita deixa uma coluna simples e uma linha no relatório; o SSMS não escreve valores para colunas computadas.

    Linha do relatório: generated_not_translated

  • defaults with functions Oracle lacks, and NEXT VALUE FOR

    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 Oracle lacks

    não criado

    Um CHECK que não pode ser escrito fica de fora e é informado.

    Linha do relatório: check_skipped

  • CHECK constraints added WITH NOCHECK or disabled

    não criado

    O SQL Server não aplica esses CHECKs, então as linhas podem violá-los.

    Linha do relatório: check_not_enforced

  • filtered and columnstore indexes, and indexes on CLOB columns

    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 ENABLE NOVALIDATE, e então validada com um aviso sobre órfãos

    A chave verifica as linhas novas na hora e é validada por último; linhas sem pai a deixam sem validação com um aviso, em vez de parar a carga.

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

    descartado

    As chaves estrangeiras do Oracle só agem na exclusão, com CASCADE ou SET NULL.

    Linha do relatório: foreign_key_action_unsupported

  • names over 128 bytes

    encurtado

    No Oracle 12.2 e posteriores, os nomes comportam 128 bytes; os do SQL Server comportam 128 caracteres.

    Linha do relatório: name_shortened

  • foreign keys to tables the dump doesn't create

    não criado

    Uma chave não pode apontar para uma tabela que não existe.

    Linha do relatório: foreign_key_skipped

  • tables on a partition scheme

    uma tabela com as linhas de todas as partições

    As linhas são as mesmas; particione a tabela de novo no Oracle se precisar.

    Linha do relatório: partitions_dropped

  • temporal tables (SYSTEM_VERSIONING)

    duas tabelas: as linhas atuais e o histórico

    A tabela e sua tabela de histórico são copiadas como tabelas simples; o Oracle não mantém o histórico sozinho.

    Linha do relatório: system_versioning_dropped

  • schemas

    um schema, tabelas com o nome do schema na frente

    O script carrega no schema do usuário que o executa, então tabelas de schemas diferentes recebem o nome do schema na frente; as tabelas de dbo mantêm seus nomes.

    Linha do relatório: schemas_merged

  • 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, functions, procedures, triggers, synonyms, types and partition functions

    listados no relatório

    O código deles é escrito em T-SQL, então eles são listados para você recriá-los.

    Linha do relatório: not_converted_objects

  • scripts without CREATE TABLE (data only)

    tipos deduzidos dos valores

    Um script só de dados tem apenas linhas, então os tipos vêm dos valores.

    Linha do relatório: no_schema

  • expressions in INSERT values

    NULL

    Um conversor que não executa um banco de dados não consegue avaliá-las.

    Linha do relatório: expression_value

  • types IntoSQL doesn't know

    CLOB

    O tipo text aceita qualquer valor; mude o tipo depois da carga.

    Linha do relatório: unknown_type

  • NUL characters in text

    mantido

    VARCHAR2 e CLOB aceitam 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 SQL ServerNo OracleLinha do relatório
bitNUMBER(1) com um CHECK de 0 e 1O Oracle 21c não tem tipo de coluna booleano; 1 e 0 mantêm os valores em todas as versões.
char(n), varchar(n), nchar(n), nvarchar(n)VARCHAR2(n CHAR), contando caracteresOs tamanhos contam caracteres, como o nvarchar do SQL Server.
varchar(max), nvarchar(max), text, ntextVARCHAR2(4000 CHAR) quando todo valor cabe em 4000 bytes, senão CLOBUm VARCHAR2 comporta 4000 bytes por padrão e o Oracle não indexa um CLOB, então o texto fica VARCHAR2 quando seus valores cabem e vira CLOB quando não cabem.text_as_lob
empty strings and empty binary valuesNULLO Oracle guarda uma string vazia como NULL, então um valor que era ' é lido como NULL. O relatório as conta por coluna.empty_string_null
decimal(p,s), money, smallmoneyNUMBER(p,s); money como NUMBER(19,4)NUMBER comporta 38 dígitos, como decimal, então todo valor é exato.
datetime, datetime2, smalldatetimeTIMESTAMP(p)Um datetime é a leitura de um relógio de parede, como o TIMESTAMP do Oracle, que guarda até nove dígitos de segundo. date vira DATE, que também guarda uma hora do dia, que fica em meia-noite.
datetimeoffsetTIMESTAMP WITH TIME ZONE, com o fuso de cada valorO Oracle mantém os fusos de -12:00 a +14:00; um valor com fuso além de -12:00 é escrito em UTC, o mesmo instante.
timeINTERVAL DAY TO SECOND desde a meia-noiteO Oracle não tem tipo de hora do dia; um intervalo a partir da meia-noite guarda todo valor.
dates that aren't validNULLUm valor que não é uma data vira NULL e o relatório o conta.date_out_of_range
json (SQL Server 2025)CLOBOs mesmos valores JSON, que as funções JSON do Oracle leem.
uniqueidentifierVARCHAR2(36)Os mesmos identificadores, escritos em minúsculas.
binary, varbinary, imageRAW(n) e BLOBBytes continuam sendo bytes.
geometry, geographyBLOB com os bytes próprios do SQL ServerO SSMS escreve valores espaciais na serialização do SQL Server, que é mantida byte a byte.spatial_as_native
rowversion, timestampBLOB, sem valoresO SQL Server define a versão de linha sozinho, e o SSMS não escreve valores para ela no script.rowversion_empty
xml, sql_variant, hierarchyid, vectorVARCHAR2 ou CLOB com o texto de cada valorO Oracle não tem um tipo equivalente; xml e sql_variant mantêm o texto de cada valor e hierarchyid o seu caminho, como /1/2/.type_replaced
collations that ignore case (_CI_)comparação exataO Oracle compara texto de forma exata, a menos que se indique outra coisa, então colunas que ignoravam maiúsculas no SQL Server agora diferenciam Ana de ana.case_insensitive_collation
IDENTITYGENERATED BY DEFAULT ON NULL AS IDENTITY, continuando depois do maior idOs ids copiados carregam como estão, e o contador continua depois do maior deles.
CREATE SEQUENCECREATE SEQUENCE com as mesmas opçõesAs sequências do Oracle funcionam do mesmo jeito. O SSMS não escreve até onde uma sequência chegou, então ela começa onde foi criada.
computed columnscolunas virtuaisO Oracle só calcula colunas geradas na leitura; colunas PERSISTED viram virtuais com os mesmos valores.stored_as_virtual
computed columns with functions Oracle lacksuma coluna simplesUma fórmula que não pode ser escrita deixa uma coluna simples e uma linha no relatório; o SSMS não escreve valores para colunas computadas.generated_not_translated
defaults with functions Oracle lacks, and NEXT VALUE FORsem valor padrãoUm valor padrão que não pode ser escrito fica de fora e é informado.default_not_translated
CHECK constraintstraduzidosOs mesmos CHECKs, testados à medida que cada linha carrega.
CHECK constraints with functions Oracle lacksnão criadoUm CHECK que não pode ser escrito fica de fora e é informado.check_skipped
CHECK constraints added WITH NOCHECK or disablednão criadoO SQL Server não aplica esses CHECKs, então as linhas podem violá-los.check_not_enforced
filtered and columnstore indexes, and indexes on CLOB columnsnão criadoO IntoSQL escreve índices b-tree sobre colunas inteiras; crie os outros de novo depois da carga.index_skipped
foreign keysdepois dos dados ENABLE NOVALIDATE, e então validada com um aviso sobre órfãosA chave verifica as linhas novas na hora e é validada por último; linhas sem pai a deixam sem validação com um aviso, em vez de parar a carga.
ON UPDATE CASCADE, SET NULL or SET DEFAULT; ON DELETE SET DEFAULTdescartadoAs chaves estrangeiras do Oracle só agem na exclusão, com CASCADE ou SET NULL.foreign_key_action_unsupported
names over 128 bytesencurtadoNo Oracle 12.2 e posteriores, os nomes comportam 128 bytes; os do SQL Server comportam 128 caracteres.name_shortened
foreign keys to tables the dump doesn't createnão criadoUma chave não pode apontar para uma tabela que não existe.foreign_key_skipped
tables on a partition schemeuma tabela com as linhas de todas as partiçõesAs linhas são as mesmas; particione a tabela de novo no Oracle se precisar.partitions_dropped
temporal tables (SYSTEM_VERSIONING)duas tabelas: as linhas atuais e o históricoA tabela e sua tabela de histórico são copiadas como tabelas simples; o Oracle não mantém o histórico sozinho.system_versioning_dropped
schemasum schema, tabelas com o nome do schema na frenteO script carrega no schema do usuário que o executa, então tabelas de schemas diferentes recebem o nome do schema na frente; as tabelas de dbo mantêm seus nomes.schemas_merged
NOT NULL columns with values that become NULLNOT NULL removidoUma coluna cujos valores tiveram de virar NULL não pode manter NOT NULL, senão a carga pararia.not_null_relaxed
views, functions, procedures, triggers, synonyms, types and partition functionslistados no relatórioO código deles é escrito em T-SQL, então eles são listados para você recriá-los.not_converted_objects
scripts without CREATE TABLE (data only)tipos deduzidos dos valoresUm script só de dados tem apenas linhas, então os tipos vêm dos valores.no_schema
expressions in INSERT valuesNULLUm conversor que não executa um banco de dados não consegue avaliá-las.expression_value
types IntoSQL doesn't knowCLOBO tipo text aceita qualquer valor; mude o tipo depois da carga.unknown_type
NUL characters in textmantidoVARCHAR2 e CLOB aceitam o caractere NUL, então o valor é copiado como está.
text that isn't valid in its encodingos 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 Oracle

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.

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

As chaves estrangeiras são adicionadas ENABLE NOVALIDATE, então as linhas novas são verificadas na hora, e depois validadas. Se uma linha antiga aponta para uma linha que não existe, o script informa qual restrição e a deixa sem validação, em vez de falhar no meio do caminho.

Para um dump grande, execute o SQL*Plus na mesma máquina do banco de dados. O script faz commit a cada 100 linhas. O usuário que o executa precisa de CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER e CREATE PROCEDURE, e de cota no seu tablespace.

Gere o dump do SQL Server para o melhor resultado

O conversor lê o que o dump contém. Estas opções mantêm mais dos seus dados nele:

  • No SSMS, clique com o botão direito no banco de dados, Tasks, Generate Scripts, e escolha as tabelas. dbatools, mssql-scripter e outras ferramentas feitas sobre a mesma biblioteca escrevem o mesmo script.
  • Em Advanced, defina Types of data to script como Schema and data. Um script só do schema tem tabelas sem linhas.
  • Salve como Unicode, o padrão do SSMS, ou como UTF-8: os dois são lidos do mesmo jeito, e gzip também funciona.

O que não é convertido

Visões, funções, procedimentos, gatilhos, sinônimos, regras e políticas de segurança são escritos em T-SQL. Eles aparecem no relatório pelo nome, nunca são descartados em silêncio, para que você possa reescrevê-los para o Oracle.

Perguntas sobre SQL Server para Oracle

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.

Ele lê o arquivo UTF-16 que o SSMS salva?

Sim. O SSMS salva scripts em UTF-16 por padrão, e o conversor lê UTF-16 e UTF-8 do mesmo jeito, com ou sem gzip, com GO entre os lotes.

De quais versões do SQL Server o script pode vir?

Scripts que o SSMS, o dbatools ou o mssql-scripter escrevem a partir do SQL Server 2017. Cada script de teste vem do SQL Server 2017, 2022 e 2025 e é comparado com a origem célula por célula.

Os valores IDENTITY são mantidos?

Sim. As colunas IDENTITY viram colunas de identidade, cada linha mantém seu id, e o próximo id continua depois do maior. As sequências são criadas com as mesmas opções.

O que acontece com money, datetimeoffset e outros tipos do SQL Server?

bit vira NUMBER(1), datetime2 TIMESTAMP com todos os dígitos, datetimeoffset TIMESTAMP WITH TIME ZONE com seu fuso, e nvarchar(max) CLOB quando seus valores não cabem em um VARCHAR2. Strings vazias viram NULL, pois é assim que o Oracle as guarda, e o relatório as conta.

E os procedimentos, gatilhos e visões?

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 Oracle o script carrega?

Oracle 19c e posteriores. Cada script de teste carrega no 21c e no 23ai e para no primeiro erro se algo der errado.