SQLite omzetten naar SQL Server
Zet een SQLite-databasebestand (.db, .sqlite, .sqlite3) neer of de SQL die .dump van sqlite3 schrijft, en download een SQL Server-script met dezelfde tabellen, sleutels, indexen en data. Elke kolom krijgt het type waarin zijn waarden passen, en elke waarde die SQL Server niet ongewijzigd kan bevatten, staat in het rapport.
18 rijen geconverteerd, geen correcties, geen afgewezen
Tabellen in shop_2024_sqlite.sqlSQLite-dump · geschreven door sqlite3 · utf-8
customers8 rijen
7 kolommen id bigint not null name nvarchar(max) not null email nvarchar(450) not null country nvarchar(max) not null is_active bit not null signed_up date created_at datetime2(0) not null orders10 rijen
9 kolommen id bigint not null customer_id bigint not null status nvarchar(450) not null total decimal(10,2) not null items int not null ordered_at datetime2(0) not null shipped_at datetime2(0) note nvarchar(max) receipt varbinary(max)
Niet geconverteerd
- Weergave order_totals
- Trigger orders_shipped
Elke database schrijft deze in een eigen taal. Herschrijf ze voor 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
Correcties
Er hoefde niets gecorrigeerd te worden.
Na te kijken
- 2 weergaven, triggers, routines of gebeurtenissen zijn niet geconverteerd; het rapport noemt ze allemaal. Maak ze met de hand opnieuw aan in SQL Server.
- De check check1 op customers kan niet voor SQL Server worden geschreven (function char_length), dus hij wordt niet aangemaakt. Schrijf de check met de hand als hij ertoe doet.
Je bestand wordt op deze computer omgezet en nooit geüpload.
Andere voorbeelden:
Wat er verandert van SQLite naar SQL Server
Elke rij is een regel die de converter toepast, met de rapportregel die hij schrijft als de regel iets in je data verandert.
declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none)
het type waarin elke waarde in de kolom past
SQLite bewaart elke waarde in elke kolom, dus het gedeclareerde type is een hint: elke kolom krijgt het type waarin al zijn waarden passen, en een kolom met gemengde waarden behoudt hun tekst.
BOOLEAN, BOOL
bit
Als elke waarde 0 of 1 is; een kolom die ook andere waarden bevat, behoudt ze als getallen of tekst.
TEXT, VARCHAR(n), CHAR(n), CLOB
nvarchar(n) of nvarchar(max)
SQLite dwingt nooit een lengte af; een gedeclareerde lengte geldt alleen als elke waarde erin past.
DECIMAL(p,s), NUMERIC
het exacte type als elke waarde erin past, anders een double
SQLite slaat deze op als gehele getallen of doubles; een gedeclareerde precisie geldt alleen als de waarden erin passen.
BLOB, and columns holding bytes
varbinary(max)
Bytes blijven bytes; tekst en getallen in dezelfde kolom blijven behouden als hun bytes.
DATE, DATETIME, TIMESTAMP holding ISO 8601 text
date, datetime2(p)
Als elke waarde een datum of een datum met tijd is; epoch-getallen en andere tekst behouden hun waarden ongewijzigd.
JSON holding JSON text
nvarchar(max)
Als elke waarde een JSON-object of -array is.
Infinity in REAL columns
NULL
Doubles in SQL Server kennen geen oneindig, dus die waarden worden NULL en het rapport telt ze.
Rapportregel: invalid_value_null
INTEGER PRIMARY KEY, AUTOINCREMENT
IDENTITY, verdergaand na het hoogste id of de waarde in sqlite_sequence
Alleen een kolom die precies als INTEGER PRIMARY KEY is gedeclareerd, is de rowid; elke rij behoudt zijn id, en de teller begint na het hoogste id dat ooit is uitgegeven.
COLLATE NOCASE
een collatie die niet op hoofdletters let
De gebruikelijke collatie van SQL Server negeert hoofdletters in elke kolom, zoals NOCASE deed bij ASCII-letters.
generated columns
berekende kolommen, PERSISTED bij STORED
SQL Server berekent ze op dezelfde manier.
generated columns with functions IntoSQL doesn't write, and the || operator
een gewone kolom
Een formule die niet kan worden geschreven, levert een gewone kolom en een regel in het rapport op; de dump bevat geen waarden voor gegenereerde kolommen.
Rapportregel: generated_not_translated
defaults with functions IntoSQL doesn't write (strftime, randomblob)
geen standaardwaarde
Een standaardwaarde die niet kan worden geschreven, wordt weggelaten en gemeld; CURRENT_TIMESTAMP en datetime('now') worden wel geschreven.
Rapportregel: default_not_translated
CHECK constraints
vertaald
Dezelfde checks, getest terwijl elke rij laadt.
CHECK constraints with functions IntoSQL doesn't write
niet aangemaakt
Een check die niet kan worden geschreven, wordt weggelaten en gemeld.
Rapportregel: check_skipped
partial and expression indexes
niet aangemaakt
IntoSQL schrijft indexen op hele kolommen; maak de andere na het laden opnieuw aan.
Rapportregel: index_skipped
foreign keys (unenforced unless PRAGMA foreign_keys=ON)
na de data WITH NOCHECK, daarna gecontroleerd
SQLite controleert refererende sleutels alleen als dat gevraagd wordt, dus rijen zonder ouder komen vaak voor: ze laden, en de sleutel blijft ongecontroleerd met een waarschuwing, in plaats van het laden te stoppen.
ON DELETE or ON UPDATE that cascades in a cycle or along a second path
NO ACTION
SQL Server weigert cascades die een tabel twee keer kunnen bereiken.
Rapportregel: foreign_key_action_dropped
VARCHAR(n) holding characters past U+FFFF (emoji)
nvarchar(2n), of nvarchar(max) boven 4000
nvarchar telt UTF-16-eenheden en een emoji neemt er twee, dus de kolom krijgt ruimte voor elke waarde.
Rapportregel: text_length_widened
foreign keys to tables the dump doesn't create
niet aangemaakt
Een sleutel kan niet verwijzen naar een tabel die er niet is.
Rapportregel: foreign_key_skipped
primary keys holding NULL, and NOT NULL columns with values that become NULL
NOT NULL weggelaten
SQLite staat NULL toe in een primaire sleutel die niet de rowid is; de kolom kan in het doel niet NOT NULL zijn, anders zou het laden stoppen.
Rapportregel: not_null_relaxed
views, triggers and virtual tables (FTS, R*Tree)
vermeld in het rapport
Hun code is geschreven in de eigen taal van SQLite, en virtuele tabellen hebben de modules van SQLite nodig; ze worden vermeld zodat je ze opnieuw kunt maken. Hun interne tabellen worden niet gekopieerd.
Rapportregel: not_converted_objects
dumps without CREATE TABLE (--data-only)
typen afgeleid uit de waarden
Een dump met alleen data bevat alleen rijen, dus de typen komen uit de waarden en de kolommen worden genummerd.
Rapportregel: no_schema
expressions in INSERT values other than the text functions dumps write
NULL
unistr(), replace(), char() en || worden geëvalueerd zoals de shell ze schrijft; andere expressies kunnen zonder database niet worden geëvalueerd.
Rapportregel: expression_value
NUL characters in text
behouden
De sqlite3-shell en Python kappen tekst af bij een NUL-teken als ze hem dumpen, dus alleen wat ervoor staat, zit in de dump.
text that isn't valid UTF-8
de foute bytes als het vervangingsteken
Dumps schrijven zulke tekst als ruwe bytes; het script is UTF-8.
Rapportregel: invalid_utf8_replaced
text decoded twice (ñ)
ongewijzigd gekopieerd
De dump bevat precies deze tekens, dus ze worden gekopieerd; het rapport wijst ze aan.
Rapportregel: mojibake_suspected
| In SQLite | In SQL Server | Rapportregel |
|---|---|---|
| declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none) | het type waarin elke waarde in de kolom pastSQLite bewaart elke waarde in elke kolom, dus het gedeclareerde type is een hint: elke kolom krijgt het type waarin al zijn waarden passen, en een kolom met gemengde waarden behoudt hun tekst. | |
| BOOLEAN, BOOL | bitAls elke waarde 0 of 1 is; een kolom die ook andere waarden bevat, behoudt ze als getallen of tekst. | |
| TEXT, VARCHAR(n), CHAR(n), CLOB | nvarchar(n) of nvarchar(max)SQLite dwingt nooit een lengte af; een gedeclareerde lengte geldt alleen als elke waarde erin past. | |
| DECIMAL(p,s), NUMERIC | het exacte type als elke waarde erin past, anders een doubleSQLite slaat deze op als gehele getallen of doubles; een gedeclareerde precisie geldt alleen als de waarden erin passen. | |
| BLOB, and columns holding bytes | varbinary(max)Bytes blijven bytes; tekst en getallen in dezelfde kolom blijven behouden als hun bytes. | |
| DATE, DATETIME, TIMESTAMP holding ISO 8601 text | date, datetime2(p)Als elke waarde een datum of een datum met tijd is; epoch-getallen en andere tekst behouden hun waarden ongewijzigd. | |
| JSON holding JSON text | nvarchar(max)Als elke waarde een JSON-object of -array is. | |
| Infinity in REAL columns | NULLDoubles in SQL Server kennen geen oneindig, dus die waarden worden NULL en het rapport telt ze. | invalid_value_null |
| INTEGER PRIMARY KEY, AUTOINCREMENT | IDENTITY, verdergaand na het hoogste id of de waarde in sqlite_sequenceAlleen een kolom die precies als INTEGER PRIMARY KEY is gedeclareerd, is de rowid; elke rij behoudt zijn id, en de teller begint na het hoogste id dat ooit is uitgegeven. | |
| COLLATE NOCASE | een collatie die niet op hoofdletters letDe gebruikelijke collatie van SQL Server negeert hoofdletters in elke kolom, zoals NOCASE deed bij ASCII-letters. | |
| generated columns | berekende kolommen, PERSISTED bij STOREDSQL Server berekent ze op dezelfde manier. | |
| generated columns with functions IntoSQL doesn't write, and the || operator | een gewone kolomEen formule die niet kan worden geschreven, levert een gewone kolom en een regel in het rapport op; de dump bevat geen waarden voor gegenereerde kolommen. | generated_not_translated |
| defaults with functions IntoSQL doesn't write (strftime, randomblob) | geen standaardwaardeEen standaardwaarde die niet kan worden geschreven, wordt weggelaten en gemeld; CURRENT_TIMESTAMP en datetime('now') worden wel geschreven. | default_not_translated |
| CHECK constraints | vertaaldDezelfde checks, getest terwijl elke rij laadt. | |
| CHECK constraints with functions IntoSQL doesn't write | niet aangemaaktEen check die niet kan worden geschreven, wordt weggelaten en gemeld. | check_skipped |
| partial and expression indexes | niet aangemaaktIntoSQL schrijft indexen op hele kolommen; maak de andere na het laden opnieuw aan. | index_skipped |
| foreign keys (unenforced unless PRAGMA foreign_keys=ON) | na de data WITH NOCHECK, daarna gecontroleerdSQLite controleert refererende sleutels alleen als dat gevraagd wordt, dus rijen zonder ouder komen vaak voor: ze laden, en de sleutel blijft ongecontroleerd met een waarschuwing, in plaats van het laden te stoppen. | |
| ON DELETE or ON UPDATE that cascades in a cycle or along a second path | NO ACTIONSQL Server weigert cascades die een tabel twee keer kunnen bereiken. | foreign_key_action_dropped |
| VARCHAR(n) holding characters past U+FFFF (emoji) | nvarchar(2n), of nvarchar(max) boven 4000nvarchar telt UTF-16-eenheden en een emoji neemt er twee, dus de kolom krijgt ruimte voor elke waarde. | text_length_widened |
| foreign keys to tables the dump doesn't create | niet aangemaaktEen sleutel kan niet verwijzen naar een tabel die er niet is. | foreign_key_skipped |
| primary keys holding NULL, and NOT NULL columns with values that become NULL | NOT NULL weggelatenSQLite staat NULL toe in een primaire sleutel die niet de rowid is; de kolom kan in het doel niet NOT NULL zijn, anders zou het laden stoppen. | not_null_relaxed |
| views, triggers and virtual tables (FTS, R*Tree) | vermeld in het rapportHun code is geschreven in de eigen taal van SQLite, en virtuele tabellen hebben de modules van SQLite nodig; ze worden vermeld zodat je ze opnieuw kunt maken. Hun interne tabellen worden niet gekopieerd. | not_converted_objects |
| dumps without CREATE TABLE (--data-only) | typen afgeleid uit de waardenEen dump met alleen data bevat alleen rijen, dus de typen komen uit de waarden en de kolommen worden genummerd. | no_schema |
| expressions in INSERT values other than the text functions dumps write | NULLunistr(), replace(), char() en || worden geëvalueerd zoals de shell ze schrijft; andere expressies kunnen zonder database niet worden geëvalueerd. | expression_value |
| NUL characters in text | behoudenDe sqlite3-shell en Python kappen tekst af bij een NUL-teken als ze hem dumpen, dus alleen wat ervoor staat, zit in de dump. | |
| text that isn't valid UTF-8 | de foute bytes als het vervangingstekenDumps schrijven zulke tekst als ruwe bytes; het script is UTF-8. | invalid_utf8_replaced |
| text decoded twice (ñ) | ongewijzigd gekopieerdDe dump bevat precies deze tekens, dus ze worden gekopieerd; het rapport wijst ze aan. | mojibake_suspected |
Het script in SQL Server laden
Het script maakt de tabellen aan, kopieert de rijen en voegt daarna sleutels, indexen en refererende sleutels toe, zodat het snel laadt en bij de eerste fout stopt.
sqlcmd -b -f 65001 -S localhost -d mydb -i sqlite.sql_server.sqlRefererende sleutels worden toegevoegd met WITH NOCHECK en daarna gecontroleerd. Verwijst een rij naar een rij die niet bestaat, dan vertelt het script welke constraint het is en laat het die ongecontroleerd, in plaats van halverwege te mislukken.
Voer bij een grote dump sqlcmd uit op dezelfde machine als de server. Elke batch van maximaal 1000 rijen wordt apart gecommit, zodat het transactielogboek klein blijft.
Een dump van SQLite maken voor het beste resultaat
De converter leest wat de dump bevat. Met deze opties blijft er meer van je data in staan:
- Het databasebestand zelf wordt ongewijzigd geconverteerd, pagina voor pagina gelezen in je browser. Sluit eerst de app die erin schrijft, zodat er geen wijziging achterblijft in het -wal-bestand.
- sqlite3 app.db .dump > app.sql schrijft dezelfde database als SQL, die ook wordt geconverteerd, als .sql of .sql.gz.
- DB Browser for SQLite schrijft die SQL met File, Export, Database to SQL file, en iterdump() in Python ook.
Wat niet wordt geconverteerd
Weergaven en triggers zijn geschreven in de eigen taal van SQLite. Ze staan op naam in het rapport en worden nooit stilletjes weggelaten, zodat je ze kunt herschrijven voor SQL Server. Virtuele tabellen, zoals FTS5 en R*Tree, worden ook vermeld, en hun schaduwtabellen worden weggelaten.
Vragen over SQLite naar SQL Server
Staat je vraag er niet bij? Schrijf ons via de contactpagina en een mens antwoordt. Contactpagina
Wordt mijn dump geüpload?
Nee. De converter draait in je browser en leest de dump in delen van je schijf, dus hij verlaat je computer nooit. De desktopapp en de opdrachtregel converteren ook op je computer.
Hoe groot mag de dump zijn?
De converter houdt nooit de hele dump in het geheugen: hij leest het bestand twee keer, in bereiken, en schrijft het script gaandeweg. Dumps van meerdere gigabytes worden geconverteerd in de browser, in de desktopapp en met de opdrachtregel.
Kan ik het .db-bestand zelf converteren?
Ja. Zet het .db-, .sqlite- of .sqlite3-bestand neer: het wordt in je browser gelezen en nooit geüpload. Tekst met NUL-tekens en elk cijfer van een double komen aan zoals ze zijn opgeslagen, wat een .dump kan afkappen.
Van welke SQLite-versies kan de dump komen?
Databasebestanden vanaf SQLite 3.0, in UTF-8 of UTF-16, en dumps van .dump in de sqlite3-shell of van iterdump() in Python. Elk testbestand en elke testdump komt van sqlite3 3.31 tot en met 3.54, STRICT- en WITHOUT ROWID-tabellen inbegrepen, en wordt cel voor cel met zijn bron vergeleken.
Hoe worden kolomtypen bepaald als SQLite ze niet afdwingt?
Het gedeclareerde type is een hint en de waarden beslissen: een kolom wordt bigint, decimal, float, date, datetime2, bit, varbinary of nvarchar als elke waarde erin past. Tekst wordt exact vergeleken, zoals in SQLite, en COLLATE NOCASE zonder op hoofdletters te letten.
Blijven INTEGER PRIMARY KEY en AUTOINCREMENT behouden?
Ja. Een INTEGER PRIMARY KEY wordt een IDENTITY-kolom, elke rij behoudt zijn id, en het volgende id gaat verder na het hoogste, of na de waarde in sqlite_sequence bij AUTOINCREMENT.
En weergaven en triggers?
Ze staan op naam in het rapport en worden niet geconverteerd, omdat elke database ze in een eigen taal schrijft.
Op welke SQL Server-versies laadt het script?
SQL Server 2017 tot en met 2025. Hetzelfde script laadt op elk ervan en stopt bij de eerste fout als er iets misgaat.