Vai al contenuto
Home di IntoSQL

Converti SQLite in SQL Server

Trascina un file di database SQLite (.db, .sqlite, .sqlite3) o il SQL che scrive il .dump di sqlite3, e scarica uno script per SQL Server con le stesse tabelle, chiavi, indici e dati. Ogni colonna riceve il tipo in cui stanno i suoi valori, e ogni valore che SQL Server non può contenere così com'è è elencato nel report.

Il tuo file
sqlshop_2024_sqlite.sqlFile di esempio, 3,4 kB
Il tuo database

18 righe convertite, nessuna correzione, nessuna rifiutata

Mostra

Tabelle in shop_2024_sqlite.sqlDump SQLite · scritto da sqlite3 · utf-8

  • customers8 righe
    7 colonne
    idbigint not null
    namenvarchar(max) not null
    emailnvarchar(450) not null
    countrynvarchar(max) not null
    is_activebit not null
    signed_update
    created_atdatetime2(0) not null
  • orders10 righe
    9 colonne
    idbigint not null
    customer_idbigint not null
    statusnvarchar(450) not null
    totaldecimal(10,2) not null
    itemsint not null
    ordered_atdatetime2(0) not null
    shipped_atdatetime2(0)
    notenvarchar(max)
    receiptvarbinary(max)

Non convertiti

  • Vista order_totals
  • Trigger orders_shipped

Ogni database li scrive nel proprio linguaggio. Riscrivili per SQL Server.

-- Written by IntoSQL from a SQLite 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 TABLE [dbo].[customers] (
    [id] bigint IDENTITY(9, 1) NOT NULL,
    [name] nvarchar(max) COLLATE Latin1_General_100_BIN2 NOT NULL,
    [email] nvarchar(450) COLLATE Latin1_General_100_CI_AS_SC NOT NULL,
    [country] nvarchar(max) COLLATE Latin1_General_100_BIN2 DEFAULT N'US' NOT NULL,
    [is_active] bit DEFAULT 1 NOT NULL,
    [signed_up] date NULL,
    [created_at] datetime2(0) DEFAULT SYSDATETIME() NOT NULL,
    CONSTRAINT [PK_customers] PRIMARY KEY ([id])
);
GO

CREATE TABLE [dbo].[orders] (
    [id] bigint IDENTITY(11, 1) NOT NULL,
    [customer_id] bigint NOT NULL,
    [status] nvarchar(450) 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(max) COLLATE Latin1_General_100_BIN2 NULL,
    [receipt] varbinary(max) NULL,
    CONSTRAINT [check1] 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','2023-01-15 10:24:00');
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','2023-02-03 08:11:42');
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','2023-03-21 19:05:17');
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','2023-05-09 02:40:00');
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');
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','2024-01-02 09:30:00');
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','2024-02-29 23:59:59');
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','2024-04-12 12:12:12');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(1,1,N'shipped',129.9,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(2,2,N'paid',54,1,'2024-03-02 11:15:00',NULL,N'Gift wrap 🎁',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(3,1,N'cancelled',12.5,1,'2024-03-03 09:45:00',NULL,N'Customer changed their mind',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(4,4,N'shipped',980,12,'2024-03-05 02:10:00','2024-03-07 08:00:00',N'请小心轻放',0x25504446);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(5,5,N'pending',45.75,2,'2024-03-08 17:20:00',NULL,CAST(N'' AS nvarchar(max))+N'Leave at the door;'+NCHAR(10)+N'ring twice',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(6,6,N'shipped',310.4,5,'2024-03-10 13:00:00','2024-03-11 09:00:00',N'Fragile: "glass"',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(7,8,N'paid',76.2,2,'2024-03-11 18:45:00',NULL,NULL,NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(8,2,N'paid',19.99,1,'2024-03-12 08:00:00',NULL,N'Paid at the counter',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(9,3,N'shipped',64,2,'2024-03-14 15:30:00',NULL,N'Shipping date never recorded',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [receipt]) VALUES
(10,7,N'paid',1499,1,'2024-03-15 21:05:00',NULL,N'C:\Users\ravi\invoice.pdf',NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO

-- Indexes, foreign keys, counters and triggers, after the rows.
CREATE UNIQUE INDEX [email] ON [dbo].[customers] ([email]);
CREATE INDEX [idx_orders_customer] ON [dbo].[orders] ([customer_id]);
CREATE INDEX [idx_orders_status_date] ON [dbo].[orders] ([status], [ordered_at]);
ALTER TABLE [dbo].[orders] WITH NOCHECK ADD CONSTRAINT [FK_orders] FOREIGN KEY ([customer_id]) REFERENCES [dbo].[customers] ([id]) ON DELETE CASCADE;
BEGIN TRY ALTER TABLE [dbo].[orders] WITH CHECK CHECK CONSTRAINT [FK_orders]; END TRY BEGIN CATCH PRINT N'Foreign key ' + N'[FK_orders]' + 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 < 8 SET @next = 8; DBCC CHECKIDENT (N'[dbo].[customers]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[orders]); IF @next IS NOT NULL BEGIN IF @next < 10 SET @next = 10; DBCC CHECKIDENT (N'[dbo].[orders]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
GO

Correzioni

Non c'era niente da correggere.

Da controllare

  • 2 viste, trigger, routine o eventi non sono convertiti; il report li elenca uno per uno. Ricreali a mano in SQL Server.
  • Il vincolo CHECK check1 su customers non si può scrivere per SQL Server (function char_length), quindi non viene creato. Se conta, scrivi a mano il vincolo CHECK.

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

Altri esempi:

Cosa cambia da SQLite a SQL Server

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

  • declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none)

    il tipo in cui stanno tutti i valori della colonna

    SQLite accetta qualsiasi valore in qualsiasi colonna, quindi il tipo dichiarato è un'indicazione: ogni colonna riceve il tipo in cui stanno tutti i suoi valori, e una colonna con valori misti ne mantiene il testo.

  • BOOLEAN, BOOL

    bit

    Quando ogni valore è 0 o 1; una colonna che contiene anche altri valori li mantiene come numeri o testo.

  • TEXT, VARCHAR(n), CHAR(n), CLOB

    nvarchar(n) o nvarchar(max)

    SQLite non applica mai una lunghezza; una lunghezza dichiarata vale solo quando ogni valore ci sta.

  • DECIMAL(p,s), NUMERIC

    il tipo esatto quando ogni valore ci sta, altrimenti un double

    SQLite li salva come interi o double; una precisione dichiarata vale solo quando i valori ci stanno.

  • BLOB, and columns holding bytes

    varbinary(max)

    I byte restano byte; testo e numeri nella stessa colonna vengono mantenuti come i loro byte.

  • DATE, DATETIME, TIMESTAMP holding ISO 8601 text

    date, datetime2(p)

    Quando ogni valore è una data o una data con ora; i numeri epoch e l'altro testo mantengono i loro valori così come sono.

  • JSON holding JSON text

    nvarchar(max)

    Quando ogni valore è un oggetto o un array JSON.

  • Infinity in REAL columns

    NULL

    I double di SQL Server non hanno l'infinito, quindi quei valori diventano NULL e il report li conta.

    Riga del report: invalid_value_null

  • INTEGER PRIMARY KEY, AUTOINCREMENT

    IDENTITY, che riparte dopo l'id più alto o dal valore di sqlite_sequence

    Solo una colonna dichiarata esattamente INTEGER PRIMARY KEY è il rowid; ogni riga mantiene il suo id, e il contatore parte dopo l'id più alto mai assegnato.

  • COLLATE NOCASE

    una collation che ignora le maiuscole

    La collation abituale di SQL Server ignora le maiuscole in ogni colonna, come faceva NOCASE con le lettere ASCII.

  • generated columns

    colonne calcolate, PERSISTED quando STORED

    SQL Server le calcola allo stesso modo.

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

    una colonna semplice

    Una formula che non si può scrivere lascia una colonna semplice e una riga nel report; il dump non ha valori per le colonne generate.

    Riga del report: generated_not_translated

  • defaults with functions IntoSQL doesn't write (strftime, randomblob)

    nessun valore predefinito

    Un valore predefinito che non si può scrivere viene omesso e segnalato; CURRENT_TIMESTAMP e datetime('now') vengono scritti.

    Riga del report: default_not_translated

  • CHECK constraints

    tradotti

    Gli stessi CHECK, verificati mentre ogni riga si carica.

  • CHECK constraints with functions IntoSQL doesn't write

    non creato

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

    Riga del report: check_skipped

  • partial and expression indexes

    non creato

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

    Riga del report: index_skipped

  • foreign keys (unenforced unless PRAGMA foreign_keys=ON)

    dopo i dati WITH NOCHECK, poi controllata

    SQLite verifica le chiavi esterne solo quando glielo si chiede, quindi le righe senza padre sono comuni: si caricano, e la chiave resta non controllata con un avviso invece di fermare il caricamento.

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

    NO ACTION

    SQL Server rifiuta le cascate che potrebbero raggiungere una tabella due volte.

    Riga del report: foreign_key_action_dropped

  • VARCHAR(n) holding characters past U+FFFF (emoji)

    nvarchar(2n), o nvarchar(max) oltre 4000

    nvarchar conta unità UTF-16 e un'emoji ne occupa due, quindi la colonna ha spazio per ogni valore.

    Riga del report: text_length_widened

  • 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

  • primary keys holding NULL, and NOT NULL columns with values that become NULL

    NOT NULL rimosso

    SQLite permette a una chiave primaria diversa dal rowid di contenere NULL; la colonna non può essere NOT NULL nella destinazione, altrimenti il caricamento si fermerebbe.

    Riga del report: not_null_relaxed

  • views, triggers and virtual tables (FTS, R*Tree)

    elencati nel report

    Il loro codice è scritto nel linguaggio di SQLite, e le tabelle virtuali richiedono i moduli di SQLite; sono elencati perché tu li ricrei. Le loro tabelle interne non vengono copiate.

    Riga del report: not_converted_objects

  • dumps without CREATE TABLE (--data-only)

    tipi ricavati dai valori

    Un dump di soli dati contiene solo righe, quindi i tipi vengono ricavati dai valori e le colonne sono numerate.

    Riga del report: no_schema

  • expressions in INSERT values other than the text functions dumps write

    NULL

    unistr(), replace(), char() e || vengono valutati come li scrive la shell; le altre espressioni non si possono valutare senza un database.

    Riga del report: expression_value

  • NUL characters in text

    mantenuto

    La shell sqlite3 e Python tagliano il testo a un carattere NUL quando lo esportano, quindi nel dump c'è solo ciò che lo precede.

  • text that isn't valid UTF-8

    i byte errati come carattere di sostituzione

    I dump scrivono quel testo come byte grezzi; lo script è UTF-8.

    Riga del report: invalid_utf8_replaced

  • text decoded twice (ñ)

    copiato così com'è

    Il dump contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala.

    Riga del report: mojibake_suspected

In SQLiteIn SQL ServerRiga del report
declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none)il tipo in cui stanno tutti i valori della colonnaSQLite accetta qualsiasi valore in qualsiasi colonna, quindi il tipo dichiarato è un'indicazione: ogni colonna riceve il tipo in cui stanno tutti i suoi valori, e una colonna con valori misti ne mantiene il testo.
BOOLEAN, BOOLbitQuando ogni valore è 0 o 1; una colonna che contiene anche altri valori li mantiene come numeri o testo.
TEXT, VARCHAR(n), CHAR(n), CLOBnvarchar(n) o nvarchar(max)SQLite non applica mai una lunghezza; una lunghezza dichiarata vale solo quando ogni valore ci sta.
DECIMAL(p,s), NUMERICil tipo esatto quando ogni valore ci sta, altrimenti un doubleSQLite li salva come interi o double; una precisione dichiarata vale solo quando i valori ci stanno.
BLOB, and columns holding bytesvarbinary(max)I byte restano byte; testo e numeri nella stessa colonna vengono mantenuti come i loro byte.
DATE, DATETIME, TIMESTAMP holding ISO 8601 textdate, datetime2(p)Quando ogni valore è una data o una data con ora; i numeri epoch e l'altro testo mantengono i loro valori così come sono.
JSON holding JSON textnvarchar(max)Quando ogni valore è un oggetto o un array JSON.
Infinity in REAL columnsNULLI double di SQL Server non hanno l'infinito, quindi quei valori diventano NULL e il report li conta.invalid_value_null
INTEGER PRIMARY KEY, AUTOINCREMENTIDENTITY, che riparte dopo l'id più alto o dal valore di sqlite_sequenceSolo una colonna dichiarata esattamente INTEGER PRIMARY KEY è il rowid; ogni riga mantiene il suo id, e il contatore parte dopo l'id più alto mai assegnato.
COLLATE NOCASEuna collation che ignora le maiuscoleLa collation abituale di SQL Server ignora le maiuscole in ogni colonna, come faceva NOCASE con le lettere ASCII.
generated columnscolonne calcolate, PERSISTED quando STOREDSQL Server le calcola allo stesso modo.
generated columns with functions IntoSQL doesn't write, and the || operatoruna colonna sempliceUna formula che non si può scrivere lascia una colonna semplice e una riga nel report; il dump non ha valori per le colonne generate.generated_not_translated
defaults with functions IntoSQL doesn't write (strftime, randomblob)nessun valore predefinitoUn valore predefinito che non si può scrivere viene omesso e segnalato; CURRENT_TIMESTAMP e datetime('now') vengono scritti.default_not_translated
CHECK constraintstradottiGli stessi CHECK, verificati mentre ogni riga si carica.
CHECK constraints with functions IntoSQL doesn't writenon creatoUn vincolo CHECK che non si può scrivere viene omesso e segnalato.check_skipped
partial and expression indexesnon creatoIntoSQL scrive indici su colonne intere; ricrea gli altri dopo il caricamento.index_skipped
foreign keys (unenforced unless PRAGMA foreign_keys=ON)dopo i dati WITH NOCHECK, poi controllataSQLite verifica le chiavi esterne solo quando glielo si chiede, quindi le righe senza padre sono comuni: si caricano, e la chiave resta non controllata con un avviso invece di fermare il caricamento.
ON DELETE or ON UPDATE that cascades in a cycle or along a second pathNO ACTIONSQL Server rifiuta le cascate che potrebbero raggiungere una tabella due volte.foreign_key_action_dropped
VARCHAR(n) holding characters past U+FFFF (emoji)nvarchar(2n), o nvarchar(max) oltre 4000nvarchar conta unità UTF-16 e un'emoji ne occupa due, quindi la colonna ha spazio per ogni valore.text_length_widened
foreign keys to tables the dump doesn't createnon creatoUna chiave non può riferirsi a una tabella che non c'è.foreign_key_skipped
primary keys holding NULL, and NOT NULL columns with values that become NULLNOT NULL rimossoSQLite permette a una chiave primaria diversa dal rowid di contenere NULL; la colonna non può essere NOT NULL nella destinazione, altrimenti il caricamento si fermerebbe.not_null_relaxed
views, triggers and virtual tables (FTS, R*Tree)elencati nel reportIl loro codice è scritto nel linguaggio di SQLite, e le tabelle virtuali richiedono i moduli di SQLite; sono elencati perché tu li ricrei. Le loro tabelle interne non vengono copiate.not_converted_objects
dumps without CREATE TABLE (--data-only)tipi ricavati dai valoriUn dump di soli dati contiene solo righe, quindi i tipi vengono ricavati dai valori e le colonne sono numerate.no_schema
expressions in INSERT values other than the text functions dumps writeNULLunistr(), replace(), char() e || vengono valutati come li scrive la shell; le altre espressioni non si possono valutare senza un database.expression_value
NUL characters in textmantenutoLa shell sqlite3 e Python tagliano il testo a un carattere NUL quando lo esportano, quindi nel dump c'è solo ciò che lo precede.
text that isn't valid UTF-8i byte errati come carattere di sostituzioneI dump scrivono quel testo come byte grezzi; lo script è UTF-8.invalid_utf8_replaced
text decoded twice (ñ)copiato così com'èIl dump contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala.mojibake_suspected

Carica lo script in SQL Server

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.

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

Le chiavi esterne vengono aggiunte WITH NOCHECK e poi controllate. Se una riga punta a una riga che non esiste, lo script dice quale vincolo e lo lascia non controllato, invece di fallire a metà.

Per un dump grande, esegui sqlcmd sulla stessa macchina del server. Ogni lotto di massimo 1000 righe fa il commit da solo, così il log delle transazioni resta piccolo.

Fai il dump di SQLite per il miglior risultato

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

  • Il file del database si converte così com'è, letto pagina per pagina nel browser. Chiudi prima l'app che ci scrive, così nessuna modifica resta indietro nel suo file -wal.
  • sqlite3 app.db .dump > app.sql scrive lo stesso database come SQL, che si converte anch'esso, come .sql o .sql.gz.
  • DB Browser for SQLite scrive quel SQL con File, Export, Database to SQL file, e così fa iterdump() di Python.

Cosa non viene convertito

Viste e trigger sono scritti nel linguaggio di SQLite. Sono elencati per nome nel report, mai rimossi in silenzio, così puoi riscriverli per SQL Server. Anche le tabelle virtuali, come FTS5 e R*Tree, sono elencate, e le loro tabelle interne vengono escluse.

Domande sulla conversione da SQLite a SQL Server

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.

Posso convertire direttamente il file .db?

Sì. Trascina il file .db, .sqlite o .sqlite3: viene letto nel browser e mai caricato. Il testo con caratteri NUL e ogni cifra di un double arrivano come sono salvati, cosa che un .dump può troncare.

Da quali versioni di SQLite può provenire il dump?

File di database da SQLite 3.0 in poi, in UTF-8 o UTF-16, e dump del .dump della shell sqlite3 o di iterdump() di Python. Ogni file e dump di test viene da sqlite3 dalla 3.31 alla 3.54, tabelle STRICT e WITHOUT ROWID incluse, ed è confrontato con la sorgente cella per cella.

Come vengono decisi i tipi di colonna se SQLite non li applica?

Il tipo dichiarato è un'indicazione e decidono i valori: una colonna diventa bigint, decimal, float, date, datetime2, bit, varbinary o nvarchar quando ogni valore ci sta. Il testo si confronta in modo esatto, come in SQLite, e COLLATE NOCASE ignorando le maiuscole.

INTEGER PRIMARY KEY e AUTOINCREMENT vengono mantenuti?

Sì. Una INTEGER PRIMARY KEY diventa una colonna IDENTITY, ogni riga mantiene il suo id, e l'id successivo riparte dopo il più alto, o dopo il valore di sqlite_sequence con AUTOINCREMENT.

E viste e trigger?

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

Su quali versioni di SQL Server si carica lo script?

SQL Server dalla 2017 alla 2025. Lo stesso script si carica su ognuna, fermandosi al primo errore se qualcosa va storto.