Pular para o conteúdo
Início do IntoSQL

Converta SQL Server para SQLite

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 SQLite com as mesmas tabelas, chaves, índices e dados. Cada valor que o SQLite 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, 3 correções, nenhuma rejeitada

Mostrar

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

  • orders10 linhas2
    11 colunas
    idINTEGER not null
    customer_idINTEGER not null
    statusVARCHAR(10) not null
    totalTEXT not null
    itemsINTEGER not null
    ordered_atDATETIME not null
    shipped_atDATETIME
    noteTEXT
    detailsTEXT
    order_refTEXT not null
    total_with_taxDECIMAL(12,2)
  • customers8 linhas1
    8 colunas
    idINTEGER not null
    nameVARCHAR(100) not null
    emailVARCHAR(200) not null
    countryVARCHAR(2) not null
    is_activeINTEGER not null
    signed_upDATE
    created_atTIMESTAMP not null
    row_versionBLOB

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 SQLite.

-- Written by IntoSQL from a SQL Server dump. Load it with: sqlite3 -bail <database> < <file>
PRAGMA foreign_keys = OFF;
PRAGMA synchronous = OFF;
BEGIN;

CREATE TABLE orders (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    customer_id INTEGER NOT NULL,
    status VARCHAR(10) DEFAULT 'pending' NOT NULL,
    total TEXT NOT NULL,
    items INTEGER DEFAULT 1 NOT NULL,
    ordered_at DATETIME NOT NULL,
    shipped_at DATETIME,
    note TEXT,
    details TEXT,
    order_ref TEXT NOT NULL,
    total_with_tax DECIMAL(12,2) GENERATED ALWAYS AS (CAST(total * (1.16) AS NUMERIC)) STORED,
    CONSTRAINT orders_items_check CHECK (items >= 0),
    CONSTRAINT orders_check2 CHECK (status = 'cancelled' OR status = 'shipped' OR status = 'paid' OR status = 'pending'),
    CONSTRAINT orders_check3 CHECK (total >= (0)),
    CONSTRAINT orders_fkey FOREIGN KEY (customer_id) REFERENCES customers (id)
);

CREATE TABLE customers ( -- People who bought at least once
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(200) NOT NULL,
    country VARCHAR(2) DEFAULT 'US' NOT NULL,
    is_active INTEGER DEFAULT 1 NOT NULL,
    signed_up DATE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    row_version BLOB,
    CONSTRAINT customers_is_active_check CHECK (is_active IN (0, 1))
);

INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15','2023-01-15 10:24:00.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03','2023-02-03 08:11:42.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(3,'José Peña','jose@example.es','ES',0,'2023-03-21','2023-03-21 19:05:17.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(4,'李雷','lilei@example.cn','CN',1,'2023-05-09','2023-05-09 02:40:00.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(5,'Noah O''Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02','2024-01-02 09:30:00.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29','2024-02-29 23:59:59.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'2024-04-12','2024-04-12 12:12:12.0000000');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(1,1,'shipped','129.9000',3,'2024-03-01T10:00:00.0000000','2024-03-02T16:30:00.1234567',NULL,'{"gift": false}','0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(2,2,'paid','54.0000',1,'2024-03-02T11:15:00.0000000',NULL,'Gift wrap 🎁','{"gift": true, "wrap": "red"}','1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(3,1,'cancelled','12.5000',1,'2024-03-03T09:45:00.0000000',NULL,'Customer changed their mind',NULL,'2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(4,4,'shipped','980.0000',12,'2024-03-05T02:10:00.0000000','2024-03-07T08:00:00.0000000','请小心轻放','{"fragile": true}','3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(5,5,'pending','45.7500',2,'2024-03-08T17:20:00.0000000',NULL,'Leave at the door; ring twice',NULL,'4f1e806c-7d5b-4c2e-9a99-5e6f708192a3');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(6,6,'shipped','310.4000',5,'2024-03-10T13:00:00.0000000','2024-03-11T09:00:00.0000000','Fragile: "glass"','{"fragile": true}','50f2917d-8e6c-4d3f-8baa-6f708192a3b4');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(7,8,'paid','76.2000',2,'2024-03-11T18:45:00.0000000',NULL,NULL,NULL,'6103a28e-9f7d-4e40-9cbb-708192a3b4c5');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(8,2,'shipped','19.9900',1,'2024-03-12T08:00:00.0000000','9999-12-31T23:59:59.9999999','Shipped date set to the maximum by an old import',NULL,'7214b39f-a08e-4f51-8dcc-8192a3b4c5d6');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(9,3,'shipped','64.0000',2,'2024-03-14T15:30:00.0000000','2024-03-15T10:00:00.0000000','Two parcels','{"parcels": [1, 2]}','8325c4a0-b19f-4062-9edd-92a3b4c5d6e7');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(10,7,'paid','1499.0000',1,'2024-03-15T21:05:00.0000000',NULL,'C:\Users\ravi\invoice.pdf',NULL,'9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8');

-- Indexes, triggers and counters, after the rows so each index builds once.
CREATE INDEX orders_idx_orders_customer ON orders (customer_id);
CREATE INDEX orders_idx_orders_status_date ON orders (status, ordered_at);
CREATE UNIQUE INDEX customers_email ON customers (email);
UPDATE sqlite_sequence SET seq = max(seq, 0) WHERE name = 'orders';
INSERT INTO sqlite_sequence (name, seq) SELECT 'orders', 0 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'orders');
UPDATE sqlite_sequence SET seq = max(seq, 0) WHERE name = 'customers';
INSERT INTO sqlite_sequence (name, seq) SELECT 'customers', 0 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'customers');
COMMIT;

-- Rows whose foreign key finds no parent, if any: the load doesn't stop for them.
PRAGMA foreign_key_check;

Correções

  1. "items" de orders é sem sinal, então virou INTEGER com um CHECK de que não é negativa.
  2. "total" de orders é money, com mais dígitos do que um número do SQLite guarda, então vira texto com todos os dígitos.
  3. "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 BLOB e fica vazia.

Para revisar

  • 6 colunas de texto comparam sem diferenciar maiúsculas na origem; o SQLite 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 SQLite.
  • O CHECK check1 de orders não pode ser escrito para o SQLite (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 SQLite (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 SQLite (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 SQLite

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

    INTEGER 0 ou 1 com um CHECK

    O SQLite não tem tipo booleano; seus próprios true e false são 1 e 0.

  • tinyint

    INTEGER com um CHECK de que não é negativo

    O tinyint do SQL Server vai de 0 a 255; um CHECK mantém o intervalo.

    Linha do relatório: unsigned_widened

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

    VARCHAR(n) e TEXT, sem limite aplicado

    O SQLite mantém o tipo declarado para as ferramentas lerem, mas não limita o tamanho.

  • decimal(p,s) past 15 digits, money

    TEXT

    O SQLite guarda cerca de 15 dígitos significativos em um número. Números mais largos ficam como texto, para que cada dígito continue exato.

    Linha do relatório: decimal_as_text

  • date, datetime, datetime2, smalldatetime

    DATETIME como texto ISO 8601, com todos os dígitos

    O SQLite guarda datas como texto que suas funções de data leem.

  • datetimeoffset

    TIMESTAMP como texto ISO 8601 em UTC

    O SQLite não tem um tipo que mantenha o fuso, então cada instante é escrito em UTC: o mesmo instante qualquer que seja o fuso que tinha.

    Linha do relatório: moments_as_utc

  • time

    TIME como texto

    O SQLite guarda horas como texto, com todos os dígitos.

  • 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)

    TEXT

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

  • uniqueidentifier

    TEXT

    Os mesmos identificadores, escritos em minúsculas.

  • binary, varbinary, image

    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

    TEXT

    O SQLite 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 SQLite compara texto de forma exata, a menos que se indique o contrário, e o seu NOCASE só iguala letras ASCII.

    Linha do relatório: case_insensitive_collation

  • IDENTITY

    INTEGER PRIMARY KEY AUTOINCREMENT, continuando depois do maior id

    O SQLite conta uma chave primária inteira que é só um inteiro, e AUTOINCREMENT impede que ids sejam reutilizados.

  • IDENTITY columns that aren't the whole primary key

    INTEGER sem contador

    O SQLite só conta uma coluna que é toda a chave primária, então a coluna mantém seus valores e as novas linhas precisam dos delas.

    Linha do relatório: counter_dropped

  • CREATE SEQUENCE

    não criado

    O SQLite não tem sequências. Os valores que uma sequência entregou estão nas linhas.

    Linha do relatório: sequence_not_converted

  • computed columns

    GENERATED ALWAYS AS, STORED quando PERSISTED, VIRTUAL nos outros casos

    O SQLite 3.31 e posteriores as calculam dos mesmos dois jeitos, com CONCAT escrito para que NULL conte como vazio, como no SQL Server.

  • computed columns with functions SQLite 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 SQLite 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 SQLite 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

    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

    no CREATE TABLE, carregadas sem verificação, depois listadas por PRAGMA foreign_key_check

    O SQLite só aceita chaves estrangeiras no CREATE TABLE e só as verifica com PRAGMA foreign_keys ligado. As linhas carregam sem verificação e o script termina listando cada linha sem pai.

  • 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 SQLite 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 SQLite não mantém o histórico sozinho.

    Linha do relatório: system_versioning_dropped

  • schemas

    um arquivo, tabelas com o nome do schema na frente

    Um arquivo SQLite é um banco de dados, então o nome do schema separa tabelas com o mesmo nome; 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

    TEXT

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

    Linha do relatório: unknown_type

  • NUL characters in text

    mantido

    O texto do SQLite 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 SQL ServerNo SQLiteLinha do relatório
bitINTEGER 0 ou 1 com um CHECKO SQLite não tem tipo booleano; seus próprios true e false são 1 e 0.
tinyintINTEGER com um CHECK de que não é negativoO tinyint do SQL Server vai de 0 a 255; um CHECK mantém o intervalo.unsigned_widened
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), textVARCHAR(n) e TEXT, sem limite aplicadoO SQLite mantém o tipo declarado para as ferramentas lerem, mas não limita o tamanho.
decimal(p,s) past 15 digits, moneyTEXTO SQLite guarda cerca de 15 dígitos significativos em um número. Números mais largos ficam como texto, para que cada dígito continue exato.decimal_as_text
date, datetime, datetime2, smalldatetimeDATETIME como texto ISO 8601, com todos os dígitosO SQLite guarda datas como texto que suas funções de data leem.
datetimeoffsetTIMESTAMP como texto ISO 8601 em UTCO SQLite não tem um tipo que mantenha o fuso, então cada instante é escrito em UTC: o mesmo instante qualquer que seja o fuso que tinha.moments_as_utc
timeTIME como textoO SQLite guarda horas como texto, com todos os dígitos.
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)TEXTOs mesmos valores JSON, que as funções JSON do SQLite leem.
uniqueidentifierTEXTOs mesmos identificadores, escritos em minúsculas.
binary, varbinary, imageBLOBBytes 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, vectorTEXTO SQLite 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 SQLite compara texto de forma exata, a menos que se indique o contrário, e o seu NOCASE só iguala letras ASCII.case_insensitive_collation
IDENTITYINTEGER PRIMARY KEY AUTOINCREMENT, continuando depois do maior idO SQLite conta uma chave primária inteira que é só um inteiro, e AUTOINCREMENT impede que ids sejam reutilizados.
IDENTITY columns that aren't the whole primary keyINTEGER sem contadorO SQLite só conta uma coluna que é toda a chave primária, então a coluna mantém seus valores e as novas linhas precisam dos delas.counter_dropped
CREATE SEQUENCEnão criadoO SQLite não tem sequências. Os valores que uma sequência entregou estão nas linhas.sequence_not_converted
computed columnsGENERATED ALWAYS AS, STORED quando PERSISTED, VIRTUAL nos outros casosO SQLite 3.31 e posteriores as calculam dos mesmos dois jeitos, com CONCAT escrito para que NULL conte como vazio, como no SQL Server.
computed columns with functions SQLite 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 SQLite 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 SQLite 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 indexesnão criadoO IntoSQL escreve índices b-tree sobre colunas inteiras; crie os outros de novo depois da carga.index_skipped
foreign keysno CREATE TABLE, carregadas sem verificação, depois listadas por PRAGMA foreign_key_checkO SQLite só aceita chaves estrangeiras no CREATE TABLE e só as verifica com PRAGMA foreign_keys ligado. As linhas carregam sem verificação e o script termina listando cada linha sem pai.
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 SQLite 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 SQLite não mantém o histórico sozinho.system_versioning_dropped
schemasum arquivo, tabelas com o nome do schema na frenteUm arquivo SQLite é um banco de dados, então o nome do schema separa tabelas com o mesmo nome; 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 knowTEXTO tipo text aceita qualquer valor; mude o tipo depois da carga.unknown_type
NUL characters in textmantidoO texto do SQLite aceita 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 SQLite

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.

sqlite3 -bail mydb.sqlite < sql_server.sqlite.sql

As chaves estrangeiras são declaradas em cada tabela e as linhas carregam com a verificação de chaves estrangeiras desligada. Depois o script lista cada linha que aponta para uma linha que não existe, em vez de falhar no meio do caminho.

Para um dump grande, carregue em um arquivo novo em um disco local. O script carrega tudo em uma transação com a sincronização desligada, então roda na velocidade do disco, e uma carga interrompida no meio não deixa tabelas incompletas.

A linha de comando carrega o arquivo direto em um banco SQLite, sem escrever um script. É grátis.

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 SQLite.

Perguntas sobre SQL Server para SQLite

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?

Uma coluna IDENTITY que é toda a chave primária da tabela vira INTEGER PRIMARY KEY AUTOINCREMENT, cada linha mantém seu id, e o próximo id continua depois do maior. Qualquer outra mantém seus valores sem contador.

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

bit vira 0 e 1, datetime2 texto ISO 8601 com todos os dígitos, datetimeoffset texto em UTC, e decimais largos e money texto exato. Colunas computadas continuam computadas. Os schemas viram prefixos do nome da tabela.

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

SQLite 3.31 e posteriores. Cada script de teste carrega no 3.31 e no 3.54 e para no primeiro erro se algo der errado.