SQLite in SQL Server umwandeln
Leg eine SQLite-Datenbankdatei (.db, .sqlite, .sqlite3) oder das SQL ab, das .dump von sqlite3 schreibt, und lade ein SQL Server-Skript mit denselben Tabellen, Schlüsseln, Indizes und Daten herunter. Jede Spalte bekommt den Typ, in den ihre Werte passen, und jeder Wert, den SQL Server nicht unverändert aufnehmen kann, steht im Bericht.
18 Zeilen konvertiert, keine Korrekturen, keine abgelehnt
Tabellen in shop_2024_sqlite.sqlSQLite-Dump · erstellt mit sqlite3 · utf-8
customers8 Zeilen
7 Spalten 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 Zeilen
9 Spalten 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)
Nicht konvertiert
- Sicht order_totals
- Trigger orders_shipped
Jede Datenbank schreibt diese in ihrer eigenen Sprache. Schreib sie für SQL Server neu.
-- 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
Korrekturen
Nichts musste korrigiert werden.
Zu prüfen
- 2 Sichten, Trigger, Routinen oder Ereignisse werden nicht konvertiert; der Bericht listet sie einzeln auf. Lege sie in SQL Server von Hand neu an.
- Die CHECK-Bedingung check1 auf customers lässt sich nicht für SQL Server schreiben (function char_length), daher wird sie nicht angelegt. Schreib die CHECK-Bedingung von Hand, wenn sie wichtig ist.
Deine Datei wird auf diesem Computer umgewandelt und nie hochgeladen.
Weitere Beispiele:
Was sich von SQLite zu SQL Server ändert
Jede Zeile ist eine Regel, die der Konverter anwendet, mit der Berichtszeile, die er schreibt, wenn die Regel etwas an deinen Daten ändert.
declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none)
der Typ, in den jeder Wert der Spalte passt
SQLite speichert jeden Wert in jeder Spalte, daher ist der deklarierte Typ nur ein Hinweis: Jede Spalte bekommt den Typ, in den alle ihre Werte passen, und eine Spalte mit gemischten Werten behält deren Text.
BOOLEAN, BOOL
bit
Wenn jeder Wert 0 oder 1 ist; eine Spalte, die auch andere Werte enthält, behält sie als Zahlen oder Text.
TEXT, VARCHAR(n), CHAR(n), CLOB
nvarchar(n) oder nvarchar(max)
SQLite erzwingt keine Länge; eine deklarierte Länge gilt nur, wenn jeder Wert hineinpasst.
DECIMAL(p,s), NUMERIC
der exakte Typ, wenn jeder Wert hineinpasst, sonst ein double
SQLite speichert sie als Ganzzahlen oder doubles; eine deklarierte Genauigkeit gilt nur, wenn die Werte hineinpassen.
BLOB, and columns holding bytes
varbinary(max)
Bytes bleiben Bytes; Text und Zahlen in derselben Spalte bleiben als ihre Bytes erhalten.
DATE, DATETIME, TIMESTAMP holding ISO 8601 text
date, datetime2(p)
Wenn jeder Wert ein Datum oder ein Datum mit Uhrzeit ist; Epoch-Zahlen und anderer Text behalten ihre Werte unverändert.
JSON holding JSON text
nvarchar(max)
Wenn jeder Wert ein JSON-Objekt oder -Array ist.
Infinity in REAL columns
NULL
In SQL Server kennen doubles kein Unendlich, daher werden diese Werte NULL, und der Bericht zählt sie.
Berichtszeile: invalid_value_null
INTEGER PRIMARY KEY, AUTOINCREMENT
IDENTITY, weiter nach der höchsten ID oder dem Wert aus sqlite_sequence
Nur eine Spalte, die genau als INTEGER PRIMARY KEY deklariert ist, ist die rowid; jede Zeile behält ihre ID, und der Zähler beginnt nach der höchsten je vergebenen ID.
COLLATE NOCASE
eine Collation ohne Groß-/Kleinschreibung
Die übliche Collation von SQL Server ignoriert die Groß-/Kleinschreibung in jeder Spalte, wie NOCASE es bei ASCII-Buchstaben tat.
generated columns
berechnete Spalten, PERSISTED bei STORED
SQL Server berechnet sie auf dieselbe Weise.
generated columns with functions IntoSQL doesn't write, and the || operator
eine normale Spalte
Eine Formel, die sich nicht schreiben lässt, hinterlässt eine normale Spalte und eine Zeile im Bericht; der Dump enthält keine Werte für generierte Spalten.
Berichtszeile: generated_not_translated
defaults with functions IntoSQL doesn't write (strftime, randomblob)
kein Standardwert
Ein Standardwert, der sich nicht schreiben lässt, wird weggelassen und gemeldet; CURRENT_TIMESTAMP und datetime('now') werden geschrieben.
Berichtszeile: default_not_translated
CHECK constraints
übersetzt
Dieselben CHECK-Bedingungen, geprüft beim Laden jeder Zeile.
CHECK constraints with functions IntoSQL doesn't write
nicht angelegt
Eine CHECK-Bedingung, die sich nicht schreiben lässt, wird weggelassen und gemeldet.
Berichtszeile: check_skipped
partial and expression indexes
nicht angelegt
IntoSQL schreibt Indizes auf ganze Spalten; lege die anderen nach dem Laden neu an.
Berichtszeile: index_skipped
foreign keys (unenforced unless PRAGMA foreign_keys=ON)
nach den Daten, WITH NOCHECK, dann geprüft
SQLite prüft Fremdschlüssel nur auf Anweisung, daher sind Zeilen ohne Elternzeile häufig: Sie laden, und der Schlüssel bleibt mit einer Warnung ungeprüft, statt das Laden abzubrechen.
ON DELETE or ON UPDATE that cascades in a cycle or along a second path
NO ACTION
SQL Server lehnt Kaskaden ab, die eine Tabelle zweimal erreichen könnten.
Berichtszeile: foreign_key_action_dropped
VARCHAR(n) holding characters past U+FFFF (emoji)
nvarchar(2n), oder nvarchar(max) über 4000
nvarchar zählt UTF-16-Einheiten, und ein Emoji belegt zwei, daher bekommt die Spalte Platz für jeden Wert.
Berichtszeile: text_length_widened
foreign keys to tables the dump doesn't create
nicht angelegt
Ein Schlüssel kann nicht auf eine Tabelle verweisen, die es nicht gibt.
Berichtszeile: foreign_key_skipped
primary keys holding NULL, and NOT NULL columns with values that become NULL
NOT NULL entfernt
SQLite erlaubt NULL in einem Primärschlüssel, der nicht die rowid ist; die Spalte kann im Ziel nicht NOT NULL sein, sonst würde das Laden abbrechen.
Berichtszeile: not_null_relaxed
views, triggers and virtual tables (FTS, R*Tree)
im Bericht aufgeführt
Ihr Code ist in der eigenen Sprache von SQLite geschrieben, und virtuelle Tabellen brauchen die Module von SQLite; sie werden aufgeführt, damit du sie neu anlegst. Ihre internen Tabellen werden nicht kopiert.
Berichtszeile: not_converted_objects
dumps without CREATE TABLE (--data-only)
Typen aus den Werten gelesen
Ein Dump nur mit Daten enthält nur Zeilen, daher kommen die Typen aus den Werten, und die Spalten werden nummeriert.
Berichtszeile: no_schema
expressions in INSERT values other than the text functions dumps write
NULL
unistr(), replace(), char() und || werden so ausgewertet, wie die Shell sie schreibt; andere Ausdrücke lassen sich ohne Datenbank nicht auswerten.
Berichtszeile: expression_value
NUL characters in text
beibehalten
Die sqlite3-Shell und Python schneiden Text beim Dumpen an einem NUL-Zeichen ab, daher steht nur, was davor kommt, im Dump.
text that isn't valid UTF-8
die fehlerhaften Bytes als Ersatzzeichen
Dumps schreiben solchen Text als rohe Bytes; das Skript ist UTF-8.
Berichtszeile: invalid_utf8_replaced
text decoded twice (ñ)
unverändert kopiert
Der Dump enthält genau diese Zeichen, daher werden sie kopiert; der Bericht weist auf sie hin.
Berichtszeile: mojibake_suspected
| In SQLite | In SQL Server | Berichtszeile |
|---|---|---|
| declared types (any text: VARCHAR(255), DATETIME, BOOLEAN, JSON or none) | der Typ, in den jeder Wert der Spalte passtSQLite speichert jeden Wert in jeder Spalte, daher ist der deklarierte Typ nur ein Hinweis: Jede Spalte bekommt den Typ, in den alle ihre Werte passen, und eine Spalte mit gemischten Werten behält deren Text. | |
| BOOLEAN, BOOL | bitWenn jeder Wert 0 oder 1 ist; eine Spalte, die auch andere Werte enthält, behält sie als Zahlen oder Text. | |
| TEXT, VARCHAR(n), CHAR(n), CLOB | nvarchar(n) oder nvarchar(max)SQLite erzwingt keine Länge; eine deklarierte Länge gilt nur, wenn jeder Wert hineinpasst. | |
| DECIMAL(p,s), NUMERIC | der exakte Typ, wenn jeder Wert hineinpasst, sonst ein doubleSQLite speichert sie als Ganzzahlen oder doubles; eine deklarierte Genauigkeit gilt nur, wenn die Werte hineinpassen. | |
| BLOB, and columns holding bytes | varbinary(max)Bytes bleiben Bytes; Text und Zahlen in derselben Spalte bleiben als ihre Bytes erhalten. | |
| DATE, DATETIME, TIMESTAMP holding ISO 8601 text | date, datetime2(p)Wenn jeder Wert ein Datum oder ein Datum mit Uhrzeit ist; Epoch-Zahlen und anderer Text behalten ihre Werte unverändert. | |
| JSON holding JSON text | nvarchar(max)Wenn jeder Wert ein JSON-Objekt oder -Array ist. | |
| Infinity in REAL columns | NULLIn SQL Server kennen doubles kein Unendlich, daher werden diese Werte NULL, und der Bericht zählt sie. | invalid_value_null |
| INTEGER PRIMARY KEY, AUTOINCREMENT | IDENTITY, weiter nach der höchsten ID oder dem Wert aus sqlite_sequenceNur eine Spalte, die genau als INTEGER PRIMARY KEY deklariert ist, ist die rowid; jede Zeile behält ihre ID, und der Zähler beginnt nach der höchsten je vergebenen ID. | |
| COLLATE NOCASE | eine Collation ohne Groß-/KleinschreibungDie übliche Collation von SQL Server ignoriert die Groß-/Kleinschreibung in jeder Spalte, wie NOCASE es bei ASCII-Buchstaben tat. | |
| generated columns | berechnete Spalten, PERSISTED bei STOREDSQL Server berechnet sie auf dieselbe Weise. | |
| generated columns with functions IntoSQL doesn't write, and the || operator | eine normale SpalteEine Formel, die sich nicht schreiben lässt, hinterlässt eine normale Spalte und eine Zeile im Bericht; der Dump enthält keine Werte für generierte Spalten. | generated_not_translated |
| defaults with functions IntoSQL doesn't write (strftime, randomblob) | kein StandardwertEin Standardwert, der sich nicht schreiben lässt, wird weggelassen und gemeldet; CURRENT_TIMESTAMP und datetime('now') werden geschrieben. | default_not_translated |
| CHECK constraints | übersetztDieselben CHECK-Bedingungen, geprüft beim Laden jeder Zeile. | |
| CHECK constraints with functions IntoSQL doesn't write | nicht angelegtEine CHECK-Bedingung, die sich nicht schreiben lässt, wird weggelassen und gemeldet. | check_skipped |
| partial and expression indexes | nicht angelegtIntoSQL schreibt Indizes auf ganze Spalten; lege die anderen nach dem Laden neu an. | index_skipped |
| foreign keys (unenforced unless PRAGMA foreign_keys=ON) | nach den Daten, WITH NOCHECK, dann geprüftSQLite prüft Fremdschlüssel nur auf Anweisung, daher sind Zeilen ohne Elternzeile häufig: Sie laden, und der Schlüssel bleibt mit einer Warnung ungeprüft, statt das Laden abzubrechen. | |
| ON DELETE or ON UPDATE that cascades in a cycle or along a second path | NO ACTIONSQL Server lehnt Kaskaden ab, die eine Tabelle zweimal erreichen könnten. | foreign_key_action_dropped |
| VARCHAR(n) holding characters past U+FFFF (emoji) | nvarchar(2n), oder nvarchar(max) über 4000nvarchar zählt UTF-16-Einheiten, und ein Emoji belegt zwei, daher bekommt die Spalte Platz für jeden Wert. | text_length_widened |
| foreign keys to tables the dump doesn't create | nicht angelegtEin Schlüssel kann nicht auf eine Tabelle verweisen, die es nicht gibt. | foreign_key_skipped |
| primary keys holding NULL, and NOT NULL columns with values that become NULL | NOT NULL entferntSQLite erlaubt NULL in einem Primärschlüssel, der nicht die rowid ist; die Spalte kann im Ziel nicht NOT NULL sein, sonst würde das Laden abbrechen. | not_null_relaxed |
| views, triggers and virtual tables (FTS, R*Tree) | im Bericht aufgeführtIhr Code ist in der eigenen Sprache von SQLite geschrieben, und virtuelle Tabellen brauchen die Module von SQLite; sie werden aufgeführt, damit du sie neu anlegst. Ihre internen Tabellen werden nicht kopiert. | not_converted_objects |
| dumps without CREATE TABLE (--data-only) | Typen aus den Werten gelesenEin Dump nur mit Daten enthält nur Zeilen, daher kommen die Typen aus den Werten, und die Spalten werden nummeriert. | no_schema |
| expressions in INSERT values other than the text functions dumps write | NULLunistr(), replace(), char() und || werden so ausgewertet, wie die Shell sie schreibt; andere Ausdrücke lassen sich ohne Datenbank nicht auswerten. | expression_value |
| NUL characters in text | beibehaltenDie sqlite3-Shell und Python schneiden Text beim Dumpen an einem NUL-Zeichen ab, daher steht nur, was davor kommt, im Dump. | |
| text that isn't valid UTF-8 | die fehlerhaften Bytes als ErsatzzeichenDumps schreiben solchen Text als rohe Bytes; das Skript ist UTF-8. | invalid_utf8_replaced |
| text decoded twice (ñ) | unverändert kopiertDer Dump enthält genau diese Zeichen, daher werden sie kopiert; der Bericht weist auf sie hin. | mojibake_suspected |
Das Skript in SQL Server laden
Das Skript legt die Tabellen an, kopiert die Zeilen und fügt dann Schlüssel, Indizes und Fremdschlüssel hinzu, so lädt es schnell und hält beim ersten Fehler an.
sqlcmd -b -f 65001 -S localhost -d mydb -i sqlite.sql_server.sqlFremdschlüssel werden mit WITH NOCHECK hinzugefügt und dann geprüft. Verweist eine Zeile auf eine nicht vorhandene Zeile, nennt das Skript den Fremdschlüssel und lässt ihn ungeprüft, statt auf halbem Weg abzubrechen.
Führe bei einem großen Dump sqlcmd auf dem Rechner des Servers aus. Jeder Stapel von bis zu 1000 Zeilen wird einzeln festgeschrieben, so bleibt das Transaktionsprotokoll klein.
Den SQLite-Dump für das beste Ergebnis erstellen
Der Konverter liest, was der Dump enthält. Mit diesen Optionen bleibt mehr von deinen Daten darin:
- Die Datenbankdatei selbst wird unverändert konvertiert und Seite für Seite in deinem Browser gelesen. Schließe zuerst die App, die in sie schreibt, damit keine Änderung in ihrer -wal-Datei zurückbleibt.
- sqlite3 app.db .dump > app.sql schreibt dieselbe Datenbank als SQL, das sich ebenfalls konvertieren lässt, als .sql oder .sql.gz.
- DB Browser for SQLite schreibt dieses SQL mit File, Export, Database to SQL file, und iterdump() in Python ebenso.
Was nicht konvertiert wird
Sichten und Trigger sind in der eigenen Sprache von SQLite geschrieben. Sie stehen mit Namen im Bericht und werden nie stillschweigend weggelassen, damit du sie für SQL Server neu schreiben kannst. Virtuelle Tabellen wie FTS5 und R*Tree werden ebenfalls aufgeführt, und ihre Schattentabellen werden weggelassen.
Fragen zu SQLite zu SQL Server
Keine Antwort gefunden? Schreib uns über die Kontaktseite, und ein Mensch antwortet. Kontaktseite
Wird mein Dump hochgeladen?
Nein. Der Konverter läuft in deinem Browser und liest den Dump stückweise von deiner Festplatte, daher verlässt er nie deinen Computer. Die Desktop-App und die Kommandozeile konvertieren ebenfalls auf deinem Computer.
Wie groß darf der Dump sein?
Der Konverter hält nie den ganzen Dump im Speicher: Er liest die Datei zweimal, in Abschnitten, und schreibt das Skript fortlaufend. Dumps von mehreren Gigabyte werden im Browser, in der Desktop-App und mit der Kommandozeile konvertiert.
Kann ich die .db-Datei selbst konvertieren?
Ja. Leg die .db-, .sqlite- oder .sqlite3-Datei ab: Sie wird in deinem Browser gelesen und nie hochgeladen. Text mit NUL-Zeichen und jede Ziffer eines double kommen so an, wie sie gespeichert sind, was ein .dump abschneiden kann.
Aus welchen SQLite-Versionen kann der Dump stammen?
Datenbankdateien ab SQLite 3.0, in UTF-8 oder UTF-16, und Dumps aus .dump der sqlite3-Shell oder aus iterdump() in Python. Jede Testdatei und jeder Test-Dump stammt aus sqlite3 3.31 bis 3.54, einschließlich STRICT- und WITHOUT ROWID-Tabellen, und wird Zelle für Zelle mit seiner Quelle verglichen.
Wie werden Spaltentypen bestimmt, wenn SQLite sie nicht erzwingt?
Der deklarierte Typ ist ein Hinweis, und die Werte entscheiden: Eine Spalte wird bigint, decimal, float, date, datetime2, bit, varbinary oder nvarchar, wenn jeder Wert hineinpasst. Text wird exakt verglichen, wie in SQLite, und COLLATE NOCASE ohne Groß-/Kleinschreibung.
Bleiben INTEGER PRIMARY KEY und AUTOINCREMENT erhalten?
Ja. Ein INTEGER PRIMARY KEY wird eine IDENTITY-Spalte, jede Zeile behält ihre ID, und die nächste ID macht nach der höchsten weiter oder, mit AUTOINCREMENT, nach dem Wert aus sqlite_sequence.
Was ist mit Sichten und Triggern?
Sie stehen mit Namen im Bericht und werden nicht konvertiert, weil jede Datenbank sie in ihrer eigenen Sprache schreibt.
Auf welchen SQL Server-Versionen lädt das Skript?
SQL Server 2017 bis 2025. Dasselbe Skript lädt auf jeder Version und hält beim ersten Fehler an, falls etwas schiefgeht.