Vai al contenuto
Home di IntoSQL

Converti SQL Server in SQLite

Trascina lo script che Generate Scripts di SSMS scrive con schema e dati, come .sql o .sql.gz, UTF-16 o UTF-8, e scarica uno script per SQLite con le stesse tabelle, chiavi, indici e dati. Ogni valore che SQLite non può contenere così com'è, e ogni oggetto che non supporta, è elencato nel report.

Il tuo file
sqlshop_2024_sqlserver.sqlFile di esempio, 11 kB
Il tuo database

18 righe convertite, 3 correzioni, nessuna rifiutata

Mostra

Tabelle in shop_2024_sqlserver.sqlDump SQL Server · scritto da SQL Server Management Objects · utf-8

  • orders10 righe2
    11 colonne
    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 righe1
    8 colonne
    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

Non convertiti

  • Vista paid_orders
  • Trigger orders_no_negative

Ogni database li scrive nel proprio linguaggio. Riscrivili per 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;

Correzioni

  1. "items" di orders è senza segno, quindi è diventata INTEGER con un vincolo CHECK che non sia negativa.
  2. "total" di orders è money, più cifre di quante ne tenga un numero di SQLite, quindi è testo con tutte le cifre.
  3. "row_version" di customers è una versione di riga che SQL Server imposta da solo; il dump non ha valori per essa, quindi è BLOB e vuota.

Da controllare

  • 6 colonne di testo confrontano ignorando maiuscole e minuscole nell'origine; SQLite confronta in modo esatto, quindi chiavi univoche e ricerche possono comportarsi diversamente. Usa una collation o un tipo di colonna che ignora maiuscole e minuscole nelle colonne che ne hanno bisogno.
  • 2 viste, trigger, routine o eventi non sono convertiti; il report li elenca uno per uno. Ricreali a mano in SQLite.
  • Il vincolo CHECK check1 su orders non si può scrivere per SQLite (function isjson), quindi non viene creato. Se conta, scrivi a mano il vincolo CHECK.
  • L'indice idx_orders_pending su orders usa un'espressione che non si può scrivere per SQLite (filtered index), quindi non viene creato. Crea l'indice a mano se le query ne hanno bisogno.
  • Il valore predefinito di "order_ref" in orders non si può scrivere per SQLite (function uuid), quindi la colonna non ha un valore predefinito. Aggiungi a mano il valore predefinito se le nuove righe ne hanno bisogno.

Il tuo file viene convertito su questo computer e non viene mai caricato.

Altri esempi:

Cosa cambia da SQL Server a SQLite

Ogni riga è una regola che il convertitore applica, con la riga del report che scrive quando la regola cambia qualcosa nei tuoi dati.

  • bit

    INTEGER 0 o 1 con un CHECK

    SQLite non ha un tipo booleano; i suoi true e false sono 1 e 0.

  • tinyint

    INTEGER con un CHECK che non sia negativo

    Il tinyint di SQL Server va da 0 a 255; un CHECK ne mantiene l'intervallo.

    Riga del report: unsigned_widened

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

    VARCHAR(n) e TEXT, non applicati

    SQLite mantiene il tipo dichiarato perché gli strumenti lo leggano, ma non limita la lunghezza.

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

    TEXT

    SQLite conserva circa 15 cifre significative in un numero. I numeri più ampi restano testo così ogni cifra resta esatta.

    Riga del report: decimal_as_text

  • date, datetime, datetime2, smalldatetime

    DATETIME come testo ISO 8601, con ogni cifra

    SQLite salva le date come testo che le sue funzioni di data leggono.

  • datetimeoffset

    TIMESTAMP come testo ISO 8601 in UTC

    SQLite non ha un tipo che conservi un offset, quindi ogni istante è scritto in UTC: lo stesso istante qualunque offset avesse.

    Riga del report: moments_as_utc

  • time

    TIME come testo

    SQLite salva gli orari come testo, con ogni cifra.

  • dates that aren't valid

    NULL

    Un valore che non è una data diventa NULL e il report lo conta.

    Riga del report: date_out_of_range

  • json (SQL Server 2025)

    TEXT

    Gli stessi valori JSON, che le funzioni JSON di SQLite leggono.

  • uniqueidentifier

    TEXT

    Gli stessi identificatori, scritti in minuscolo.

  • binary, varbinary, image

    BLOB

    I byte restano byte.

  • geometry, geography

    BLOB con i byte propri di SQL Server

    SSMS scrive i valori spaziali nella serializzazione di SQL Server, che viene mantenuta byte per byte.

    Riga del report: spatial_as_native

  • rowversion, timestamp

    BLOB, vuoto

    SQL Server imposta da solo la versione di riga e SSMS non ne scrive i valori nello script.

    Riga del report: rowversion_empty

  • xml, sql_variant, hierarchyid, vector

    TEXT

    SQLite non ha un tipo equivalente; xml e sql_variant mantengono il testo di ogni valore e hierarchyid il suo percorso, come /1/2/.

    Riga del report: type_replaced

  • collations that ignore case (_CI_)

    confronto esatto

    SQLite confronta il testo in modo esatto salvo indicazione diversa, e il suo NOCASE ignora le maiuscole solo per le lettere ASCII.

    Riga del report: case_insensitive_collation

  • IDENTITY

    INTEGER PRIMARY KEY AUTOINCREMENT, che riparte dopo l'id più alto

    SQLite conta una chiave primaria intera di tipo intero, e AUTOINCREMENT evita che gli id vengano riusati.

  • IDENTITY columns that aren't the whole primary key

    INTEGER senza contatore

    SQLite conta solo una colonna che è l'intera chiave primaria, quindi la colonna mantiene i suoi valori e le nuove righe devono avere i loro.

    Riga del report: counter_dropped

  • CREATE SEQUENCE

    non creato

    SQLite non ha sequenze. I valori assegnati da una sequenza sono nelle righe.

    Riga del report: sequence_not_converted

  • computed columns

    GENERATED ALWAYS AS, STORED se PERSISTED, altrimenti VIRTUAL

    SQLite dalla 3.31 le calcola negli stessi due modi, con CONCAT scritto in modo che NULL valga come vuoto, come in SQL Server.

  • computed columns with functions SQLite lacks

    una colonna semplice

    Una formula che non si può scrivere lascia una colonna semplice e una riga nel report; SSMS non scrive valori per le colonne calcolate.

    Riga del report: generated_not_translated

  • defaults with functions SQLite lacks, and NEXT VALUE FOR

    nessun valore predefinito

    Un valore predefinito che non si può scrivere viene omesso e segnalato.

    Riga del report: default_not_translated

  • CHECK constraints

    tradotti

    Gli stessi CHECK, verificati mentre ogni riga si carica.

  • CHECK constraints with functions SQLite lacks

    non creato

    Un vincolo CHECK che non si può scrivere viene omesso e segnalato.

    Riga del report: check_skipped

  • CHECK constraints added WITH NOCHECK or disabled

    non creato

    SQL Server non applica questi CHECK, quindi le righe potrebbero violarli.

    Riga del report: check_not_enforced

  • filtered and columnstore indexes

    non creato

    IntoSQL scrive indici b-tree su colonne intere; ricrea gli altri dopo il caricamento.

    Riga del report: index_skipped

  • foreign keys

    in CREATE TABLE, caricate senza controllo, poi elencate da PRAGMA foreign_key_check

    SQLite accetta le chiavi esterne solo in CREATE TABLE e le verifica solo con PRAGMA foreign_keys attivo. Le righe si caricano senza controllo e lo script finisce elencando ogni riga senza padre.

  • foreign keys to tables the dump doesn't create

    non creato

    Una chiave non può riferirsi a una tabella che non c'è.

    Riga del report: foreign_key_skipped

  • tables on a partition scheme

    una tabella con le righe di ogni partizione

    Le righe sono le stesse; partiziona di nuovo la tabella in SQLite se serve.

    Riga del report: partitions_dropped

  • temporal tables (SYSTEM_VERSIONING)

    due tabelle: le righe attuali e la cronologia

    La tabella e la sua tabella di cronologia vengono copiate come tabelle semplici; SQLite non mantiene la cronologia da solo.

    Riga del report: system_versioning_dropped

  • schemas

    un file, tabelle con il nome del loro schema davanti

    Un file SQLite è un solo database, quindi il nome dello schema separa le tabelle con lo stesso nome; le tabelle in dbo mantengono il loro nome.

    Riga del report: schemas_merged

  • NOT NULL columns with values that become NULL

    NOT NULL rimosso

    Una colonna i cui valori sono dovuti diventare NULL non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe.

    Riga del report: not_null_relaxed

  • views, functions, procedures, triggers, synonyms, types and partition functions

    elencati nel report

    Il loro codice è scritto in T-SQL, quindi vengono elencati perché tu li ricrei.

    Riga del report: not_converted_objects

  • scripts without CREATE TABLE (data only)

    tipi ricavati dai valori

    Uno script di soli dati contiene solo righe, quindi i tipi vengono ricavati dai valori.

    Riga del report: no_schema

  • expressions in INSERT values

    NULL

    Un convertitore che non esegue un database non può valutarle.

    Riga del report: expression_value

  • types IntoSQL doesn't know

    TEXT

    Il testo contiene qualsiasi valore; cambia il tipo dopo il caricamento.

    Riga del report: unknown_type

  • NUL characters in text

    mantenuto

    Il testo di SQLite può contenere un carattere NUL, quindi il valore viene copiato così com'è.

  • text that isn't valid in its encoding

    i byte errati come carattere di sostituzione

    Lo script è UTF-8 e ogni valore deve essere testo valido.

    Riga del report: invalid_utf8_replaced

  • text decoded twice (ñ)

    copiato così com'è

    Lo script contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala.

    Riga del report: mojibake_suspected

In SQL ServerIn SQLiteRiga del report
bitINTEGER 0 o 1 con un CHECKSQLite non ha un tipo booleano; i suoi true e false sono 1 e 0.
tinyintINTEGER con un CHECK che non sia negativoIl tinyint di SQL Server va da 0 a 255; un CHECK ne mantiene l'intervallo.unsigned_widened
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), textVARCHAR(n) e TEXT, non applicatiSQLite mantiene il tipo dichiarato perché gli strumenti lo leggano, ma non limita la lunghezza.
decimal(p,s) past 15 digits, moneyTEXTSQLite conserva circa 15 cifre significative in un numero. I numeri più ampi restano testo così ogni cifra resta esatta.decimal_as_text
date, datetime, datetime2, smalldatetimeDATETIME come testo ISO 8601, con ogni cifraSQLite salva le date come testo che le sue funzioni di data leggono.
datetimeoffsetTIMESTAMP come testo ISO 8601 in UTCSQLite non ha un tipo che conservi un offset, quindi ogni istante è scritto in UTC: lo stesso istante qualunque offset avesse.moments_as_utc
timeTIME come testoSQLite salva gli orari come testo, con ogni cifra.
dates that aren't validNULLUn valore che non è una data diventa NULL e il report lo conta.date_out_of_range
json (SQL Server 2025)TEXTGli stessi valori JSON, che le funzioni JSON di SQLite leggono.
uniqueidentifierTEXTGli stessi identificatori, scritti in minuscolo.
binary, varbinary, imageBLOBI byte restano byte.
geometry, geographyBLOB con i byte propri di SQL ServerSSMS scrive i valori spaziali nella serializzazione di SQL Server, che viene mantenuta byte per byte.spatial_as_native
rowversion, timestampBLOB, vuotoSQL Server imposta da solo la versione di riga e SSMS non ne scrive i valori nello script.rowversion_empty
xml, sql_variant, hierarchyid, vectorTEXTSQLite non ha un tipo equivalente; xml e sql_variant mantengono il testo di ogni valore e hierarchyid il suo percorso, come /1/2/.type_replaced
collations that ignore case (_CI_)confronto esattoSQLite confronta il testo in modo esatto salvo indicazione diversa, e il suo NOCASE ignora le maiuscole solo per le lettere ASCII.case_insensitive_collation
IDENTITYINTEGER PRIMARY KEY AUTOINCREMENT, che riparte dopo l'id più altoSQLite conta una chiave primaria intera di tipo intero, e AUTOINCREMENT evita che gli id vengano riusati.
IDENTITY columns that aren't the whole primary keyINTEGER senza contatoreSQLite conta solo una colonna che è l'intera chiave primaria, quindi la colonna mantiene i suoi valori e le nuove righe devono avere i loro.counter_dropped
CREATE SEQUENCEnon creatoSQLite non ha sequenze. I valori assegnati da una sequenza sono nelle righe.sequence_not_converted
computed columnsGENERATED ALWAYS AS, STORED se PERSISTED, altrimenti VIRTUALSQLite dalla 3.31 le calcola negli stessi due modi, con CONCAT scritto in modo che NULL valga come vuoto, come in SQL Server.
computed columns with functions SQLite lacksuna colonna sempliceUna formula che non si può scrivere lascia una colonna semplice e una riga nel report; SSMS non scrive valori per le colonne calcolate.generated_not_translated
defaults with functions SQLite lacks, and NEXT VALUE FORnessun valore predefinitoUn valore predefinito che non si può scrivere viene omesso e segnalato.default_not_translated
CHECK constraintstradottiGli stessi CHECK, verificati mentre ogni riga si carica.
CHECK constraints with functions SQLite lacksnon creatoUn vincolo CHECK che non si può scrivere viene omesso e segnalato.check_skipped
CHECK constraints added WITH NOCHECK or disablednon creatoSQL Server non applica questi CHECK, quindi le righe potrebbero violarli.check_not_enforced
filtered and columnstore indexesnon creatoIntoSQL scrive indici b-tree su colonne intere; ricrea gli altri dopo il caricamento.index_skipped
foreign keysin CREATE TABLE, caricate senza controllo, poi elencate da PRAGMA foreign_key_checkSQLite accetta le chiavi esterne solo in CREATE TABLE e le verifica solo con PRAGMA foreign_keys attivo. Le righe si caricano senza controllo e lo script finisce elencando ogni riga senza padre.
foreign keys to tables the dump doesn't createnon creatoUna chiave non può riferirsi a una tabella che non c'è.foreign_key_skipped
tables on a partition schemeuna tabella con le righe di ogni partizioneLe righe sono le stesse; partiziona di nuovo la tabella in SQLite se serve.partitions_dropped
temporal tables (SYSTEM_VERSIONING)due tabelle: le righe attuali e la cronologiaLa tabella e la sua tabella di cronologia vengono copiate come tabelle semplici; SQLite non mantiene la cronologia da solo.system_versioning_dropped
schemasun file, tabelle con il nome del loro schema davantiUn file SQLite è un solo database, quindi il nome dello schema separa le tabelle con lo stesso nome; le tabelle in dbo mantengono il loro nome.schemas_merged
NOT NULL columns with values that become NULLNOT NULL rimossoUna colonna i cui valori sono dovuti diventare NULL non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe.not_null_relaxed
views, functions, procedures, triggers, synonyms, types and partition functionselencati nel reportIl loro codice è scritto in T-SQL, quindi vengono elencati perché tu li ricrei.not_converted_objects
scripts without CREATE TABLE (data only)tipi ricavati dai valoriUno script di soli dati contiene solo righe, quindi i tipi vengono ricavati dai valori.no_schema
expressions in INSERT valuesNULLUn convertitore che non esegue un database non può valutarle.expression_value
types IntoSQL doesn't knowTEXTIl testo contiene qualsiasi valore; cambia il tipo dopo il caricamento.unknown_type
NUL characters in textmantenutoIl testo di SQLite può contenere un carattere NUL, quindi il valore viene copiato così com'è.
text that isn't valid in its encodingi byte errati come carattere di sostituzioneLo script è UTF-8 e ogni valore deve essere testo valido.invalid_utf8_replaced
text decoded twice (ñ)copiato così com'èLo script contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala.mojibake_suspected

Carica lo script in SQLite

Lo script crea le tabelle, copia le righe, poi aggiunge chiavi, indici e chiavi esterne, così si carica in fretta e si ferma al primo errore.

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

Le chiavi esterne sono dichiarate in ogni tabella e le righe si caricano con i controlli delle chiavi esterne disattivati. Lo script poi elenca ogni riga che punta a una riga che non esiste, invece di fallire a metà.

Per un dump grande, carica in un file nuovo su un disco locale. Lo script carica tutto in un'unica transazione con la sincronizzazione disattivata, così va alla velocità del disco, e un caricamento che si ferma a metà non lascia tabelle parziali.

La riga di comando carica il file direttamente in un database SQLite, senza scrivere uno script. È gratis.

Fai il dump di SQL Server per il miglior risultato

Il convertitore legge ciò che il dump contiene. Con queste opzioni il dump conserva più dei tuoi dati:

  • In SSMS, clic destro sul database, Tasks, Generate Scripts, e scegli le tabelle. dbatools, mssql-scripter e altri strumenti basati sulla stessa libreria scrivono lo stesso script.
  • In Advanced, imposta Types of data to script su Schema and data. Uno script del solo schema ha tabelle senza righe.
  • Salvalo come Unicode, il default di SSMS, o come UTF-8: entrambi vengono letti allo stesso modo, e funziona anche gzip.

Cosa non viene convertito

Viste, funzioni, procedure, trigger, sinonimi, regole e policy di sicurezza sono scritti in T-SQL. Sono elencati per nome nel report, mai rimossi in silenzio, così puoi riscriverli per SQLite.

Domande sulla conversione da SQL Server a SQLite

Non trovi la risposta? Scrivici dalla pagina dei contatti e ti risponde una persona. Pagina dei contatti

Il mio dump viene caricato?

No. Il convertitore funziona nel tuo browser e legge il dump dal tuo disco a pezzi, quindi non lascia mai il tuo computer. Anche l'app desktop e la riga di comando convertono sul tuo computer.

Quanto può essere grande il dump?

Il convertitore non tiene mai l'intero dump in memoria: legge il file due volte, per intervalli, e scrive lo script man mano. I dump di più gigabyte si convertono nel browser, nell'app desktop e con la riga di comando.

Legge il file UTF-16 che salva SSMS?

Sì. SSMS salva gli script in UTF-16 di default, e il convertitore legge allo stesso modo UTF-16 e UTF-8, compressi con gzip o no, con GO tra i batch.

Da quali versioni di SQL Server può provenire lo script?

Script scritti da SSMS, dbatools o mssql-scripter da SQL Server 2017 in poi. Ogni script di test viene da SQL Server 2017, 2022 e 2025 ed è confrontato con la sorgente cella per cella.

I valori IDENTITY vengono mantenuti?

Una colonna IDENTITY che è l'intera chiave primaria della tabella diventa INTEGER PRIMARY KEY AUTOINCREMENT, ogni riga mantiene il suo id e il prossimo id riparte dopo il più alto. Le altre mantengono i valori senza contatore.

Cosa succede a money, datetimeoffset e altri tipi di SQL Server?

bit diventa 0 e 1, datetime2 testo ISO 8601 con ogni cifra, datetimeoffset testo in UTC, e i decimal ampi e money testo esatto. Le colonne calcolate restano calcolate. Gli schemi diventano prefissi dei nomi di tabella.

E procedure, trigger e viste?

Sono elencati per nome nel report e non vengono convertiti, perché ogni database li scrive nel proprio linguaggio.

Su quali versioni di SQLite si carica lo script?

SQLite 3.31 e successive. Ogni script di test si carica su 3.31 e 3.54, fermandosi al primo errore se qualcosa va storto.