Zum Inhalt springen
IntoSQL-Startseite

SQL Server in SQLite umwandeln

Leg das Skript ab, das Generate Scripts in SSMS mit Schema und Daten schreibt, als .sql oder .sql.gz, UTF-16 oder UTF-8, und lade ein SQLite-Skript mit denselben Tabellen, Schlüsseln, Indizes und Daten herunter. Jeder Wert, den SQLite nicht unverändert aufnehmen kann, und jedes Objekt, das es nicht übernimmt, steht im Bericht.

Deine Datei
sqlshop_2024_sqlserver.sqlBeispieldatei, 11 kB
Deine Datenbank

18 Zeilen konvertiert, 3 Korrekturen, keine abgelehnt

Anzeigen

Tabellen in shop_2024_sqlserver.sqlSQL Server-Dump · erstellt mit SQL Server Management Objects · utf-8

  • orders10 Zeilen2
    11 Spalten
    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 Zeilen1
    8 Spalten
    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

Nicht konvertiert

  • Sicht paid_orders
  • Trigger orders_no_negative

Jede Datenbank schreibt diese in ihrer eigenen Sprache. Schreib sie für SQLite neu.

-- 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;

Korrekturen

  1. "items" von orders ist vorzeichenlos und wurde deshalb INTEGER mit einer CHECK-Bedingung gegen negative Werte.
  2. "total" von orders ist money, mehr Stellen, als eine Zahl in SQLite fasst, daher ist sie Text mit allen Stellen.
  3. "row_version" von customers ist eine Zeilenversion, die SQL Server selbst setzt; der Dump hat keine Werte dafür, daher ist es BLOB und leer.

Zu prüfen

  • 6 Textspalten vergleichen in der Quelle ohne Rücksicht auf Groß- und Kleinschreibung; SQLite vergleicht exakt, daher können sich eindeutige Schlüssel und Suchen anders verhalten. Nutze eine Collation oder einen Spaltentyp ohne Unterscheidung der Groß- und Kleinschreibung für die Spalten, die das brauchen.
  • 2 Sichten, Trigger, Routinen oder Ereignisse werden nicht konvertiert; der Bericht listet sie einzeln auf. Lege sie in SQLite von Hand neu an.
  • Die CHECK-Bedingung check1 auf orders lässt sich nicht für SQLite schreiben (function isjson), daher wird sie nicht angelegt. Schreib die CHECK-Bedingung von Hand, wenn sie wichtig ist.
  • Der Index idx_orders_pending auf orders nutzt einen Ausdruck, der sich nicht für SQLite schreiben lässt (filtered index), daher wird er nicht angelegt. Lege den Index von Hand an, wenn Abfragen ihn brauchen.
  • Der Standardwert von "order_ref" in orders lässt sich nicht für SQLite schreiben (function uuid), daher hat die Spalte keinen Standardwert. Füge den Standardwert von Hand hinzu, wenn neue Zeilen ihn brauchen.

Deine Datei wird auf diesem Computer umgewandelt und nie hochgeladen.

Weitere Beispiele:

Was sich von SQL Server zu SQLite ändert

Jede Zeile ist eine Regel, die der Konverter anwendet, mit der Berichtszeile, die er schreibt, wenn die Regel etwas an deinen Daten ändert.

  • bit

    INTEGER 0 oder 1 mit einem CHECK

    SQLite hat keinen booleschen Typ; sein eigenes true und false sind 1 und 0.

  • tinyint

    INTEGER mit einem CHECK gegen negative Werte

    tinyint in SQL Server reicht von 0 bis 255; ein CHECK bewahrt seinen Bereich.

    Berichtszeile: unsigned_widened

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

    VARCHAR(n) und TEXT, nicht erzwungen

    SQLite behält den deklarierten Typ für Werkzeuge, begrenzt aber die Länge nicht.

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

    TEXT

    SQLite hält etwa 15 signifikante Stellen in einer Zahl. Breitere Zahlen bleiben Text, damit jede Stelle exakt bleibt.

    Berichtszeile: decimal_as_text

  • date, datetime, datetime2, smalldatetime

    DATETIME als ISO-8601-Text, jede Stelle erhalten

    SQLite speichert Datumsangaben als Text, den seine Datumsfunktionen lesen.

  • datetimeoffset

    TIMESTAMP als ISO-8601-Text in UTC

    SQLite hat keinen Typ, der einen Versatz behält, daher wird jeder Zeitpunkt in UTC geschrieben: derselbe Zeitpunkt, welchen Versatz er auch hatte.

    Berichtszeile: moments_as_utc

  • time

    TIME als Text

    SQLite speichert Zeiten als Text, mit jeder Stelle.

  • dates that aren't valid

    NULL

    Ein Wert, der kein Datum ist, wird NULL, und der Bericht zählt ihn.

    Berichtszeile: date_out_of_range

  • json (SQL Server 2025)

    TEXT

    Dieselben JSON-Werte, die die JSON-Funktionen von SQLite lesen.

  • uniqueidentifier

    TEXT

    Dieselben Bezeichner, kleingeschrieben.

  • binary, varbinary, image

    BLOB

    Bytes bleiben Bytes.

  • geometry, geography

    BLOB mit den eigenen Bytes von SQL Server

    SSMS schreibt räumliche Werte in der Serialisierung von SQL Server, die Byte für Byte erhalten bleibt.

    Berichtszeile: spatial_as_native

  • rowversion, timestamp

    BLOB, leer

    SQL Server setzt eine Zeilenversion selbst, und SSMS schreibt keine Werte dafür.

    Berichtszeile: rowversion_empty

  • xml, sql_variant, hierarchyid, vector

    TEXT

    SQLite hat keinen entsprechenden Typ; xml und sql_variant behalten den Text jedes Werts und hierarchyid seinen Pfad, etwa /1/2/.

    Berichtszeile: type_replaced

  • collations that ignore case (_CI_)

    exakter Vergleich

    SQLite vergleicht Text exakt, sofern nicht anders angegeben, und sein NOCASE gleicht nur ASCII-Buchstaben an.

    Berichtszeile: case_insensitive_collation

  • IDENTITY

    INTEGER PRIMARY KEY AUTOINCREMENT, weiter nach der höchsten ID

    SQLite zählt einen ganzen ganzzahligen Primärschlüssel, und AUTOINCREMENT verhindert, dass IDs wiederverwendet werden.

  • IDENTITY columns that aren't the whole primary key

    INTEGER ohne Zähler

    SQLite zählt nur eine Spalte, die den ganzen Primärschlüssel bildet, daher behält die Spalte ihre Werte, und neue Zeilen brauchen eigene.

    Berichtszeile: counter_dropped

  • CREATE SEQUENCE

    nicht angelegt

    SQLite hat keine Sequenzen. Die Werte, die eine Sequenz vergeben hat, stehen in den Zeilen.

    Berichtszeile: sequence_not_converted

  • computed columns

    GENERATED ALWAYS AS, STORED bei PERSISTED, sonst VIRTUAL

    SQLite 3.31 und neuer berechnet sie auf dieselben zwei Arten, wobei CONCAT so geschrieben wird, dass NULL wie in SQL Server als leer zählt.

  • computed columns with functions SQLite lacks

    eine normale Spalte

    Eine Formel, die sich nicht schreiben lässt, hinterlässt eine normale Spalte und eine Zeile im Bericht; SSMS schreibt keine Werte für berechnete Spalten.

    Berichtszeile: generated_not_translated

  • defaults with functions SQLite lacks, and NEXT VALUE FOR

    kein Standardwert

    Ein Standardwert, der sich nicht schreiben lässt, wird weggelassen und gemeldet.

    Berichtszeile: default_not_translated

  • CHECK constraints

    übersetzt

    Dieselben CHECK-Bedingungen, geprüft beim Laden jeder Zeile.

  • CHECK constraints with functions SQLite lacks

    nicht angelegt

    Eine CHECK-Bedingung, die sich nicht schreiben lässt, wird weggelassen und gemeldet.

    Berichtszeile: check_skipped

  • CHECK constraints added WITH NOCHECK or disabled

    nicht angelegt

    SQL Server wendet diese CHECK-Bedingungen nicht an, daher können die Zeilen sie verletzen.

    Berichtszeile: check_not_enforced

  • filtered and columnstore indexes

    nicht angelegt

    IntoSQL schreibt B-Tree-Indizes auf ganze Spalten; lege die anderen nach dem Laden neu an.

    Berichtszeile: index_skipped

  • foreign keys

    in CREATE TABLE, ungeprüft geladen, dann mit PRAGMA foreign_key_check aufgelistet

    SQLite nimmt Fremdschlüssel nur in CREATE TABLE an und prüft sie nur mit eingeschaltetem PRAGMA foreign_keys. Die Zeilen laden ungeprüft, und das Skript listet am Ende jede Zeile ohne Elternzeile auf.

  • 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

  • tables on a partition scheme

    eine Tabelle mit den Zeilen aller Partitionen

    Die Zeilen sind dieselben; partitioniere die Tabelle in SQLite neu, wenn nötig.

    Berichtszeile: partitions_dropped

  • temporal tables (SYSTEM_VERSIONING)

    zwei Tabellen: die aktuellen Zeilen und die Historie

    Die Tabelle und ihre Historientabelle werden als normale Tabellen kopiert; SQLite führt die Historie nicht selbst.

    Berichtszeile: system_versioning_dropped

  • schemas

    eine Datei, jede Tabelle mit dem Namen ihres Schemas vorangestellt

    Eine SQLite-Datei ist eine Datenbank, daher hält der Schemaname gleichnamige Tabellen auseinander; Tabellen in dbo behalten ihre Namen.

    Berichtszeile: schemas_merged

  • NOT NULL columns with values that become NULL

    NOT NULL entfernt

    Eine Spalte, deren Werte NULL werden mussten, kann NOT NULL nicht behalten, sonst würde das Laden abbrechen.

    Berichtszeile: not_null_relaxed

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

    im Bericht aufgeführt

    Ihr Code ist in T-SQL geschrieben, daher werden sie aufgeführt, damit du sie neu anlegst.

    Berichtszeile: not_converted_objects

  • scripts without CREATE TABLE (data only)

    Typen aus den Werten gelesen

    Ein Skript nur mit Daten enthält nur Zeilen, daher kommen die Typen aus den Werten.

    Berichtszeile: no_schema

  • expressions in INSERT values

    NULL

    Ein Konverter, der keine Datenbank ausführt, kann sie nicht auswerten.

    Berichtszeile: expression_value

  • types IntoSQL doesn't know

    TEXT

    Text nimmt jeden Wert auf; ändere den Typ nach dem Laden.

    Berichtszeile: unknown_type

  • NUL characters in text

    erhalten

    Text in SQLite kann ein NUL-Zeichen enthalten, daher wird der Wert unverändert kopiert.

  • text that isn't valid in its encoding

    die fehlerhaften Bytes als Ersatzzeichen

    Das Skript ist UTF-8, und jeder Wert muss gültiger Text sein.

    Berichtszeile: invalid_utf8_replaced

  • text decoded twice (ñ)

    unverändert kopiert

    Das Skript enthält genau diese Zeichen, daher werden sie kopiert; der Bericht weist auf sie hin.

    Berichtszeile: mojibake_suspected

In SQL ServerIn SQLiteBerichtszeile
bitINTEGER 0 oder 1 mit einem CHECKSQLite hat keinen booleschen Typ; sein eigenes true und false sind 1 und 0.
tinyintINTEGER mit einem CHECK gegen negative Wertetinyint in SQL Server reicht von 0 bis 255; ein CHECK bewahrt seinen Bereich.unsigned_widened
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), textVARCHAR(n) und TEXT, nicht erzwungenSQLite behält den deklarierten Typ für Werkzeuge, begrenzt aber die Länge nicht.
decimal(p,s) past 15 digits, moneyTEXTSQLite hält etwa 15 signifikante Stellen in einer Zahl. Breitere Zahlen bleiben Text, damit jede Stelle exakt bleibt.decimal_as_text
date, datetime, datetime2, smalldatetimeDATETIME als ISO-8601-Text, jede Stelle erhaltenSQLite speichert Datumsangaben als Text, den seine Datumsfunktionen lesen.
datetimeoffsetTIMESTAMP als ISO-8601-Text in UTCSQLite hat keinen Typ, der einen Versatz behält, daher wird jeder Zeitpunkt in UTC geschrieben: derselbe Zeitpunkt, welchen Versatz er auch hatte.moments_as_utc
timeTIME als TextSQLite speichert Zeiten als Text, mit jeder Stelle.
dates that aren't validNULLEin Wert, der kein Datum ist, wird NULL, und der Bericht zählt ihn.date_out_of_range
json (SQL Server 2025)TEXTDieselben JSON-Werte, die die JSON-Funktionen von SQLite lesen.
uniqueidentifierTEXTDieselben Bezeichner, kleingeschrieben.
binary, varbinary, imageBLOBBytes bleiben Bytes.
geometry, geographyBLOB mit den eigenen Bytes von SQL ServerSSMS schreibt räumliche Werte in der Serialisierung von SQL Server, die Byte für Byte erhalten bleibt.spatial_as_native
rowversion, timestampBLOB, leerSQL Server setzt eine Zeilenversion selbst, und SSMS schreibt keine Werte dafür.rowversion_empty
xml, sql_variant, hierarchyid, vectorTEXTSQLite hat keinen entsprechenden Typ; xml und sql_variant behalten den Text jedes Werts und hierarchyid seinen Pfad, etwa /1/2/.type_replaced
collations that ignore case (_CI_)exakter VergleichSQLite vergleicht Text exakt, sofern nicht anders angegeben, und sein NOCASE gleicht nur ASCII-Buchstaben an.case_insensitive_collation
IDENTITYINTEGER PRIMARY KEY AUTOINCREMENT, weiter nach der höchsten IDSQLite zählt einen ganzen ganzzahligen Primärschlüssel, und AUTOINCREMENT verhindert, dass IDs wiederverwendet werden.
IDENTITY columns that aren't the whole primary keyINTEGER ohne ZählerSQLite zählt nur eine Spalte, die den ganzen Primärschlüssel bildet, daher behält die Spalte ihre Werte, und neue Zeilen brauchen eigene.counter_dropped
CREATE SEQUENCEnicht angelegtSQLite hat keine Sequenzen. Die Werte, die eine Sequenz vergeben hat, stehen in den Zeilen.sequence_not_converted
computed columnsGENERATED ALWAYS AS, STORED bei PERSISTED, sonst VIRTUALSQLite 3.31 und neuer berechnet sie auf dieselben zwei Arten, wobei CONCAT so geschrieben wird, dass NULL wie in SQL Server als leer zählt.
computed columns with functions SQLite lackseine normale SpalteEine Formel, die sich nicht schreiben lässt, hinterlässt eine normale Spalte und eine Zeile im Bericht; SSMS schreibt keine Werte für berechnete Spalten.generated_not_translated
defaults with functions SQLite lacks, and NEXT VALUE FORkein StandardwertEin Standardwert, der sich nicht schreiben lässt, wird weggelassen und gemeldet.default_not_translated
CHECK constraintsübersetztDieselben CHECK-Bedingungen, geprüft beim Laden jeder Zeile.
CHECK constraints with functions SQLite lacksnicht angelegtEine CHECK-Bedingung, die sich nicht schreiben lässt, wird weggelassen und gemeldet.check_skipped
CHECK constraints added WITH NOCHECK or disablednicht angelegtSQL Server wendet diese CHECK-Bedingungen nicht an, daher können die Zeilen sie verletzen.check_not_enforced
filtered and columnstore indexesnicht angelegtIntoSQL schreibt B-Tree-Indizes auf ganze Spalten; lege die anderen nach dem Laden neu an.index_skipped
foreign keysin CREATE TABLE, ungeprüft geladen, dann mit PRAGMA foreign_key_check aufgelistetSQLite nimmt Fremdschlüssel nur in CREATE TABLE an und prüft sie nur mit eingeschaltetem PRAGMA foreign_keys. Die Zeilen laden ungeprüft, und das Skript listet am Ende jede Zeile ohne Elternzeile auf.
foreign keys to tables the dump doesn't createnicht angelegtEin Schlüssel kann nicht auf eine Tabelle verweisen, die es nicht gibt.foreign_key_skipped
tables on a partition schemeeine Tabelle mit den Zeilen aller PartitionenDie Zeilen sind dieselben; partitioniere die Tabelle in SQLite neu, wenn nötig.partitions_dropped
temporal tables (SYSTEM_VERSIONING)zwei Tabellen: die aktuellen Zeilen und die HistorieDie Tabelle und ihre Historientabelle werden als normale Tabellen kopiert; SQLite führt die Historie nicht selbst.system_versioning_dropped
schemaseine Datei, jede Tabelle mit dem Namen ihres Schemas vorangestelltEine SQLite-Datei ist eine Datenbank, daher hält der Schemaname gleichnamige Tabellen auseinander; Tabellen in dbo behalten ihre Namen.schemas_merged
NOT NULL columns with values that become NULLNOT NULL entferntEine Spalte, deren Werte NULL werden mussten, kann NOT NULL nicht behalten, sonst würde das Laden abbrechen.not_null_relaxed
views, functions, procedures, triggers, synonyms, types and partition functionsim Bericht aufgeführtIhr Code ist in T-SQL geschrieben, daher werden sie aufgeführt, damit du sie neu anlegst.not_converted_objects
scripts without CREATE TABLE (data only)Typen aus den Werten gelesenEin Skript nur mit Daten enthält nur Zeilen, daher kommen die Typen aus den Werten.no_schema
expressions in INSERT valuesNULLEin Konverter, der keine Datenbank ausführt, kann sie nicht auswerten.expression_value
types IntoSQL doesn't knowTEXTText nimmt jeden Wert auf; ändere den Typ nach dem Laden.unknown_type
NUL characters in texterhaltenText in SQLite kann ein NUL-Zeichen enthalten, daher wird der Wert unverändert kopiert.
text that isn't valid in its encodingdie fehlerhaften Bytes als ErsatzzeichenDas Skript ist UTF-8, und jeder Wert muss gültiger Text sein.invalid_utf8_replaced
text decoded twice (ñ)unverändert kopiertDas Skript enthält genau diese Zeichen, daher werden sie kopiert; der Bericht weist auf sie hin.mojibake_suspected

Das Skript in SQLite 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.

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

Fremdschlüssel werden in jeder Tabelle deklariert, und die Zeilen laden mit ausgeschalteter Fremdschlüsselprüfung. Danach listet das Skript jede Zeile auf, die auf eine nicht vorhandene Zeile verweist, statt auf halbem Weg abzubrechen.

Lade einen großen Dump in eine neue Datei auf einer lokalen Festplatte. Das Skript lädt alles in einer Transaktion ohne Synchronisierung, so läuft es mit Festplattengeschwindigkeit, und ein abgebrochenes Laden hinterlässt keine halben Tabellen.

Die Kommandozeile lädt die Datei direkt in eine SQLite-Datenbank, ohne ein Skript zu schreiben. Das ist kostenlos.

Den SQL Server-Dump für das beste Ergebnis erstellen

Der Konverter liest, was der Dump enthält. Mit diesen Optionen bleibt mehr von deinen Daten darin:

  • Klicke in SSMS mit der rechten Maustaste auf die Datenbank, dann auf Tasks, Generate Scripts, und wähle die Tabellen. dbatools, mssql-scripter und andere Werkzeuge auf Basis derselben Bibliothek schreiben dasselbe Skript.
  • Setze unter Advanced die Option Types of data to script auf Schema and data. Ein Skript nur mit dem Schema hat Tabellen ohne Zeilen.
  • Speichere es als Unicode, den Standard von SSMS, oder als UTF-8: Beides wird gleich gelesen, und gzip funktioniert auch.

Was nicht konvertiert wird

Sichten, Funktionen, Prozeduren, Trigger, Synonyme, Regeln und Sicherheitsrichtlinien sind in T-SQL geschrieben. Sie stehen mit Namen im Bericht und werden nie stillschweigend weggelassen, damit du sie für SQLite neu schreiben kannst.

Fragen zu SQL Server zu SQLite

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.

Liest es die UTF-16-Datei, die SSMS speichert?

Ja. SSMS speichert Skripte standardmäßig als UTF-16, und der Konverter liest UTF-16 und UTF-8 gleichermaßen, gezippt oder nicht, mit GO zwischen den Batches.

Aus welchen SQL Server-Versionen kann das Skript stammen?

Skripte, die SSMS, dbatools oder mssql-scripter ab SQL Server 2017 schreiben. Jedes Test-Skript stammt aus SQL Server 2017, 2022 und 2025 und wird Zelle für Zelle mit seiner Quelle verglichen.

Bleiben IDENTITY-Werte erhalten?

Eine IDENTITY-Spalte, die den ganzen Primärschlüssel der Tabelle bildet, wird INTEGER PRIMARY KEY AUTOINCREMENT, jede Zeile behält ihre ID, und die nächste ID macht nach der höchsten weiter. Jede andere behält ihre Werte ohne Zähler.

Was passiert mit money, datetimeoffset und anderen SQL Server-Typen?

bit wird 0 und 1, datetime2 ISO-8601-Text mit jeder Stelle, datetimeoffset UTC-Text, und breite Dezimalzahlen und money exakter Text. Berechnete Spalten bleiben berechnet. Schemas werden Präfixe der Tabellennamen.

Was ist mit Prozeduren, Triggern und Sichten?

Sie stehen mit Namen im Bericht und werden nicht konvertiert, weil jede Datenbank sie in ihrer eigenen Sprache schreibt.

Auf welchen SQLite-Versionen lädt das Skript?

SQLite 3.31 und neuer. Jedes Test-Skript lädt auf 3.31 und 3.54 und hält beim ersten Fehler an, falls etwas schiefgeht.