Naar de inhoud
IntoSQL-startpagina

SQL Server omzetten naar SQLite

Zet het script neer dat Generate Scripts van SSMS met schema en data schrijft, als .sql of .sql.gz, UTF-16 of UTF-8, en download een SQLite-script met dezelfde tabellen, sleutels, indexen en data. Elke waarde die SQLite niet ongewijzigd kan bevatten, en elk object dat het niet overneemt, staat in het rapport.

Je bestand
sqlshop_2024_sqlserver.sqlVoorbeeldbestand, 11 kB
Je database

18 rijen geconverteerd, 3 correcties, geen afgewezen

Tonen

Tabellen in shop_2024_sqlserver.sqlSQL Server-dump · geschreven door SQL Server Management Objects · utf-8

  • orders10 rijen2
    11 kolommen
    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 rijen1
    8 kolommen
    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

Niet geconverteerd

  • Weergave paid_orders
  • Trigger orders_no_negative

Elke database schrijft deze in een eigen taal. Herschrijf ze voor SQLite.

-- Written by IntoSQL from a SQL Server dump. Load it with: sqlite3 -bail <database> < <file>
PRAGMA foreign_keys = OFF;
PRAGMA synchronous = OFF;
BEGIN;

CREATE TABLE orders (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    customer_id INTEGER NOT NULL,
    status VARCHAR(10) DEFAULT 'pending' NOT NULL,
    total TEXT NOT NULL,
    items INTEGER DEFAULT 1 NOT NULL,
    ordered_at DATETIME NOT NULL,
    shipped_at DATETIME,
    note TEXT,
    details TEXT,
    order_ref TEXT NOT NULL,
    total_with_tax DECIMAL(12,2) GENERATED ALWAYS AS (CAST(total * (1.16) AS NUMERIC)) STORED,
    CONSTRAINT orders_items_check CHECK (items >= 0),
    CONSTRAINT orders_check2 CHECK (status = 'cancelled' OR status = 'shipped' OR status = 'paid' OR status = 'pending'),
    CONSTRAINT orders_check3 CHECK (total >= (0)),
    CONSTRAINT orders_fkey FOREIGN KEY (customer_id) REFERENCES customers (id)
);

CREATE TABLE customers ( -- People who bought at least once
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(200) NOT NULL,
    country VARCHAR(2) DEFAULT 'US' NOT NULL,
    is_active INTEGER DEFAULT 1 NOT NULL,
    signed_up DATE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    row_version BLOB,
    CONSTRAINT customers_is_active_check CHECK (is_active IN (0, 1))
);

INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15','2023-01-15 10:24:00.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03','2023-02-03 08:11:42.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(3,'José Peña','jose@example.es','ES',0,'2023-03-21','2023-03-21 19:05:17.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(4,'李雷','lilei@example.cn','CN',1,'2023-05-09','2023-05-09 02:40:00.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(5,'Noah O''Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02','2024-01-02 09:30:00.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29','2024-02-29 23:59:59.0000000');
INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at) VALUES
(8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'2024-04-12','2024-04-12 12:12:12.0000000');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(1,1,'shipped','129.9000',3,'2024-03-01T10:00:00.0000000','2024-03-02T16:30:00.1234567',NULL,'{"gift": false}','0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(2,2,'paid','54.0000',1,'2024-03-02T11:15:00.0000000',NULL,'Gift wrap 🎁','{"gift": true, "wrap": "red"}','1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(3,1,'cancelled','12.5000',1,'2024-03-03T09:45:00.0000000',NULL,'Customer changed their mind',NULL,'2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(4,4,'shipped','980.0000',12,'2024-03-05T02:10:00.0000000','2024-03-07T08:00:00.0000000','请小心轻放','{"fragile": true}','3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(5,5,'pending','45.7500',2,'2024-03-08T17:20:00.0000000',NULL,'Leave at the door; ring twice',NULL,'4f1e806c-7d5b-4c2e-9a99-5e6f708192a3');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(6,6,'shipped','310.4000',5,'2024-03-10T13:00:00.0000000','2024-03-11T09:00:00.0000000','Fragile: "glass"','{"fragile": true}','50f2917d-8e6c-4d3f-8baa-6f708192a3b4');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(7,8,'paid','76.2000',2,'2024-03-11T18:45:00.0000000',NULL,NULL,NULL,'6103a28e-9f7d-4e40-9cbb-708192a3b4c5');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(8,2,'shipped','19.9900',1,'2024-03-12T08:00:00.0000000','9999-12-31T23:59:59.9999999','Shipped date set to the maximum by an old import',NULL,'7214b39f-a08e-4f51-8dcc-8192a3b4c5d6');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(9,3,'shipped','64.0000',2,'2024-03-14T15:30:00.0000000','2024-03-15T10:00:00.0000000','Two parcels','{"parcels": [1, 2]}','8325c4a0-b19f-4062-9edd-92a3b4c5d6e7');
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) VALUES
(10,7,'paid','1499.0000',1,'2024-03-15T21:05:00.0000000',NULL,'C:\Users\ravi\invoice.pdf',NULL,'9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8');

-- Indexes, triggers and counters, after the rows so each index builds once.
CREATE INDEX orders_idx_orders_customer ON orders (customer_id);
CREATE INDEX orders_idx_orders_status_date ON orders (status, ordered_at);
CREATE UNIQUE INDEX customers_email ON customers (email);
UPDATE sqlite_sequence SET seq = max(seq, 0) WHERE name = 'orders';
INSERT INTO sqlite_sequence (name, seq) SELECT 'orders', 0 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'orders');
UPDATE sqlite_sequence SET seq = max(seq, 0) WHERE name = 'customers';
INSERT INTO sqlite_sequence (name, seq) SELECT 'customers', 0 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'customers');
COMMIT;

-- Rows whose foreign key finds no parent, if any: the load doesn't stop for them.
PRAGMA foreign_key_check;

Correcties

  1. "items" van orders is unsigned, dus het is INTEGER geworden met een check dat het niet negatief is.
  2. "total" van orders is money, meer cijfers dan een getal in SQLite bewaart, dus het is tekst met elk cijfer.
  3. "row_version" van customers is een rijversie die SQL Server zelf instelt; de dump heeft er geen waarden voor, dus het is BLOB en leeg.

Na te kijken

  • 6 tekstkolommen vergelijken in de bron zonder op hoofdletters te letten; SQLite vergelijkt exact, dus unieke sleutels en zoekopdrachten kunnen anders werken. Gebruik een collation of kolomtype dat hoofdletters negeert voor de kolommen die dat nodig hebben.
  • 2 weergaven, triggers, routines of gebeurtenissen zijn niet geconverteerd; het rapport noemt ze allemaal. Maak ze met de hand opnieuw aan in SQLite.
  • De check check1 op orders kan niet voor SQLite worden geschreven (function isjson), dus hij wordt niet aangemaakt. Schrijf de check met de hand als hij ertoe doet.
  • De index idx_orders_pending op orders gebruikt een expressie die niet voor SQLite kan worden geschreven (filtered index), dus hij wordt niet aangemaakt. Maak de index met de hand aan als query's hem nodig hebben.
  • De standaardwaarde van "order_ref" in orders kan niet voor SQLite worden geschreven (function uuid), dus de kolom heeft geen standaardwaarde. Voeg de standaardwaarde met de hand toe als nieuwe rijen die nodig hebben.

Je bestand wordt op deze computer omgezet en nooit geüpload.

Andere voorbeelden:

Wat er verandert van SQL Server naar SQLite

Elke rij is een regel die de converter toepast, met de rapportregel die hij schrijft als de regel iets in je data verandert.

  • bit

    INTEGER 0 of 1 met een CHECK

    SQLite heeft geen boolean-type; zijn eigen true en false zijn 1 en 0.

  • tinyint

    INTEGER met een CHECK dat het niet negatief is

    tinyint in SQL Server loopt van 0 tot 255; een check behoudt dat bereik.

    Rapportregel: unsigned_widened

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

    VARCHAR(n) en TEXT, niet afgedwongen

    SQLite bewaart het gedeclareerde type zodat tools het kunnen lezen, maar beperkt de lengte niet.

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

    TEXT

    SQLite bewaart ongeveer 15 significante cijfers in een getal. Bredere getallen blijven tekst, zodat elk cijfer exact blijft.

    Rapportregel: decimal_as_text

  • date, datetime, datetime2, smalldatetime

    DATETIME als ISO 8601-tekst, elk cijfer behouden

    SQLite slaat datums op als tekst die zijn datumfuncties lezen.

  • datetimeoffset

    TIMESTAMP als ISO 8601-tekst in UTC

    SQLite heeft geen type dat een offset bewaart, dus elk moment wordt in UTC geschreven: hetzelfde moment, welke offset het ook had.

    Rapportregel: moments_as_utc

  • time

    TIME als tekst

    SQLite bewaart tijden als tekst, met elk cijfer.

  • dates that aren't valid

    NULL

    Een waarde die geen datum is, wordt NULL en het rapport telt hem.

    Rapportregel: date_out_of_range

  • json (SQL Server 2025)

    TEXT

    Dezelfde JSON-waarden, die de JSON-functies van SQLite lezen.

  • uniqueidentifier

    TEXT

    Dezelfde identifiers, in kleine letters geschreven.

  • binary, varbinary, image

    BLOB

    Bytes blijven bytes.

  • geometry, geography

    BLOB met de eigen bytes van SQL Server

    SSMS schrijft ruimtelijke waarden in de serialisatie van SQL Server, die byte voor byte behouden blijft.

    Rapportregel: spatial_as_native

  • rowversion, timestamp

    BLOB, leeg

    SQL Server stelt een rijversie zelf in en SSMS neemt er geen waarden voor op in het script.

    Rapportregel: rowversion_empty

  • xml, sql_variant, hierarchyid, vector

    TEXT

    SQLite heeft geen gelijkwaardig type; xml en sql_variant behouden de tekst van elke waarde en hierarchyid zijn pad, zoals /1/2/.

    Rapportregel: type_replaced

  • collations that ignore case (_CI_)

    exacte vergelijking

    SQLite vergelijkt tekst exact, tenzij anders aangegeven, en zijn NOCASE negeert alleen hoofdletters bij ASCII-letters.

    Rapportregel: case_insensitive_collation

  • IDENTITY

    INTEGER PRIMARY KEY AUTOINCREMENT, verdergaand na het hoogste id

    SQLite telt een hele primaire sleutel van gehele getallen, en AUTOINCREMENT voorkomt dat id's opnieuw worden gebruikt.

  • IDENTITY columns that aren't the whole primary key

    INTEGER zonder teller

    SQLite telt alleen een kolom die de hele primaire sleutel is, dus de kolom behoudt zijn waarden en nieuwe rijen hebben hun eigen waarden nodig.

    Rapportregel: counter_dropped

  • CREATE SEQUENCE

    niet aangemaakt

    SQLite heeft geen sequences. De waarden die een sequence uitdeelde, staan in de rijen.

    Rapportregel: sequence_not_converted

  • computed columns

    GENERATED ALWAYS AS, STORED bij PERSISTED, anders VIRTUAL

    SQLite 3.31 en later berekenen ze op dezelfde twee manieren, met CONCAT zo geschreven dat NULL als leeg telt, zoals in SQL Server.

  • computed columns with functions SQLite lacks

    een gewone kolom

    Een formule die niet kan worden geschreven, levert een gewone kolom en een regel in het rapport op; SSMS neemt geen waarden voor berekende kolommen op in het script.

    Rapportregel: generated_not_translated

  • defaults with functions SQLite lacks, and NEXT VALUE FOR

    geen standaardwaarde

    Een standaardwaarde die niet kan worden geschreven, wordt weggelaten en gemeld.

    Rapportregel: default_not_translated

  • CHECK constraints

    vertaald

    Dezelfde checks, getest terwijl elke rij laadt.

  • CHECK constraints with functions SQLite lacks

    niet aangemaakt

    Een check die niet kan worden geschreven, wordt weggelaten en gemeld.

    Rapportregel: check_skipped

  • CHECK constraints added WITH NOCHECK or disabled

    niet aangemaakt

    SQL Server past deze checks niet toe, dus de rijen kunnen ze schenden.

    Rapportregel: check_not_enforced

  • filtered and columnstore indexes

    niet aangemaakt

    IntoSQL schrijft b-tree-indexen op hele kolommen; maak de andere na het laden opnieuw aan.

    Rapportregel: index_skipped

  • foreign keys

    in CREATE TABLE, ongecontroleerd geladen, daarna opgesomd door PRAGMA foreign_key_check

    SQLite accepteert refererende sleutels alleen in CREATE TABLE en controleert ze alleen met PRAGMA foreign_keys aan. De rijen laden ongecontroleerd en het script somt aan het einde elke rij zonder ouder op.

  • 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

  • tables on a partition scheme

    één tabel met de rijen van elke partitie

    De rijen zijn dezelfde; partitioneer de tabel opnieuw in SQLite als dat nodig is.

    Rapportregel: partitions_dropped

  • temporal tables (SYSTEM_VERSIONING)

    twee tabellen: de huidige rijen en de geschiedenis

    De tabel en zijn geschiedenistabel worden als gewone tabellen gekopieerd; SQLite houdt de geschiedenis niet zelf bij.

    Rapportregel: system_versioning_dropped

  • schemas

    één bestand, tabellen met de naam van hun schema ervoor

    Een SQLite-bestand is één database, dus de schemanaam houdt tabellen met dezelfde naam uit elkaar; tabellen in dbo behouden hun naam.

    Rapportregel: schemas_merged

  • NOT NULL columns with values that become NULL

    NOT NULL weggelaten

    Een kolom waarvan waarden NULL moesten worden, kan NOT NULL niet houden, anders zou het laden stoppen.

    Rapportregel: not_null_relaxed

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

    vermeld in het rapport

    Hun code is geschreven in T-SQL, dus ze worden vermeld zodat je ze opnieuw kunt maken.

    Rapportregel: not_converted_objects

  • scripts without CREATE TABLE (data only)

    typen afgeleid uit de waarden

    Een script met alleen data bevat alleen rijen, dus de typen komen uit de waarden.

    Rapportregel: no_schema

  • expressions in INSERT values

    NULL

    Een converter die geen database draait, kan ze niet evalueren.

    Rapportregel: expression_value

  • types IntoSQL doesn't know

    TEXT

    Tekst kan elke waarde bevatten; wijzig het type na het laden.

    Rapportregel: unknown_type

  • NUL characters in text

    behouden

    Tekst in SQLite kan een NUL-teken bevatten, dus de waarde wordt ongewijzigd gekopieerd.

  • text that isn't valid in its encoding

    de foute bytes als het vervangingsteken

    Het script is UTF-8 en elke waarde moet geldige tekst zijn.

    Rapportregel: invalid_utf8_replaced

  • text decoded twice (ñ)

    ongewijzigd gekopieerd

    Het script bevat precies deze tekens, dus ze worden gekopieerd; het rapport wijst ze aan.

    Rapportregel: mojibake_suspected

In SQL ServerIn SQLiteRapportregel
bitINTEGER 0 of 1 met een CHECKSQLite heeft geen boolean-type; zijn eigen true en false zijn 1 en 0.
tinyintINTEGER met een CHECK dat het niet negatief istinyint in SQL Server loopt van 0 tot 255; een check behoudt dat bereik.unsigned_widened
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), textVARCHAR(n) en TEXT, niet afgedwongenSQLite bewaart het gedeclareerde type zodat tools het kunnen lezen, maar beperkt de lengte niet.
decimal(p,s) past 15 digits, moneyTEXTSQLite bewaart ongeveer 15 significante cijfers in een getal. Bredere getallen blijven tekst, zodat elk cijfer exact blijft.decimal_as_text
date, datetime, datetime2, smalldatetimeDATETIME als ISO 8601-tekst, elk cijfer behoudenSQLite slaat datums op als tekst die zijn datumfuncties lezen.
datetimeoffsetTIMESTAMP als ISO 8601-tekst in UTCSQLite heeft geen type dat een offset bewaart, dus elk moment wordt in UTC geschreven: hetzelfde moment, welke offset het ook had.moments_as_utc
timeTIME als tekstSQLite bewaart tijden als tekst, met elk cijfer.
dates that aren't validNULLEen waarde die geen datum is, wordt NULL en het rapport telt hem.date_out_of_range
json (SQL Server 2025)TEXTDezelfde JSON-waarden, die de JSON-functies van SQLite lezen.
uniqueidentifierTEXTDezelfde identifiers, in kleine letters geschreven.
binary, varbinary, imageBLOBBytes blijven bytes.
geometry, geographyBLOB met de eigen bytes van SQL ServerSSMS schrijft ruimtelijke waarden in de serialisatie van SQL Server, die byte voor byte behouden blijft.spatial_as_native
rowversion, timestampBLOB, leegSQL Server stelt een rijversie zelf in en SSMS neemt er geen waarden voor op in het script.rowversion_empty
xml, sql_variant, hierarchyid, vectorTEXTSQLite heeft geen gelijkwaardig type; xml en sql_variant behouden de tekst van elke waarde en hierarchyid zijn pad, zoals /1/2/.type_replaced
collations that ignore case (_CI_)exacte vergelijkingSQLite vergelijkt tekst exact, tenzij anders aangegeven, en zijn NOCASE negeert alleen hoofdletters bij ASCII-letters.case_insensitive_collation
IDENTITYINTEGER PRIMARY KEY AUTOINCREMENT, verdergaand na het hoogste idSQLite telt een hele primaire sleutel van gehele getallen, en AUTOINCREMENT voorkomt dat id's opnieuw worden gebruikt.
IDENTITY columns that aren't the whole primary keyINTEGER zonder tellerSQLite telt alleen een kolom die de hele primaire sleutel is, dus de kolom behoudt zijn waarden en nieuwe rijen hebben hun eigen waarden nodig.counter_dropped
CREATE SEQUENCEniet aangemaaktSQLite heeft geen sequences. De waarden die een sequence uitdeelde, staan in de rijen.sequence_not_converted
computed columnsGENERATED ALWAYS AS, STORED bij PERSISTED, anders VIRTUALSQLite 3.31 en later berekenen ze op dezelfde twee manieren, met CONCAT zo geschreven dat NULL als leeg telt, zoals in SQL Server.
computed columns with functions SQLite lackseen gewone kolomEen formule die niet kan worden geschreven, levert een gewone kolom en een regel in het rapport op; SSMS neemt geen waarden voor berekende kolommen op in het script.generated_not_translated
defaults with functions SQLite lacks, and NEXT VALUE FORgeen standaardwaardeEen standaardwaarde die niet kan worden geschreven, wordt weggelaten en gemeld.default_not_translated
CHECK constraintsvertaaldDezelfde checks, getest terwijl elke rij laadt.
CHECK constraints with functions SQLite lacksniet aangemaaktEen check die niet kan worden geschreven, wordt weggelaten en gemeld.check_skipped
CHECK constraints added WITH NOCHECK or disabledniet aangemaaktSQL Server past deze checks niet toe, dus de rijen kunnen ze schenden.check_not_enforced
filtered and columnstore indexesniet aangemaaktIntoSQL schrijft b-tree-indexen op hele kolommen; maak de andere na het laden opnieuw aan.index_skipped
foreign keysin CREATE TABLE, ongecontroleerd geladen, daarna opgesomd door PRAGMA foreign_key_checkSQLite accepteert refererende sleutels alleen in CREATE TABLE en controleert ze alleen met PRAGMA foreign_keys aan. De rijen laden ongecontroleerd en het script somt aan het einde elke rij zonder ouder op.
foreign keys to tables the dump doesn't createniet aangemaaktEen sleutel kan niet verwijzen naar een tabel die er niet is.foreign_key_skipped
tables on a partition schemeéén tabel met de rijen van elke partitieDe rijen zijn dezelfde; partitioneer de tabel opnieuw in SQLite als dat nodig is.partitions_dropped
temporal tables (SYSTEM_VERSIONING)twee tabellen: de huidige rijen en de geschiedenisDe tabel en zijn geschiedenistabel worden als gewone tabellen gekopieerd; SQLite houdt de geschiedenis niet zelf bij.system_versioning_dropped
schemaséén bestand, tabellen met de naam van hun schema ervoorEen SQLite-bestand is één database, dus de schemanaam houdt tabellen met dezelfde naam uit elkaar; tabellen in dbo behouden hun naam.schemas_merged
NOT NULL columns with values that become NULLNOT NULL weggelatenEen kolom waarvan waarden NULL moesten worden, kan NOT NULL niet houden, anders zou het laden stoppen.not_null_relaxed
views, functions, procedures, triggers, synonyms, types and partition functionsvermeld in het rapportHun code is geschreven in T-SQL, dus ze worden vermeld zodat je ze opnieuw kunt maken.not_converted_objects
scripts without CREATE TABLE (data only)typen afgeleid uit de waardenEen script met alleen data bevat alleen rijen, dus de typen komen uit de waarden.no_schema
expressions in INSERT valuesNULLEen converter die geen database draait, kan ze niet evalueren.expression_value
types IntoSQL doesn't knowTEXTTekst kan elke waarde bevatten; wijzig het type na het laden.unknown_type
NUL characters in textbehoudenTekst in SQLite kan een NUL-teken bevatten, dus de waarde wordt ongewijzigd gekopieerd.
text that isn't valid in its encodingde foute bytes als het vervangingstekenHet script is UTF-8 en elke waarde moet geldige tekst zijn.invalid_utf8_replaced
text decoded twice (ñ)ongewijzigd gekopieerdHet script bevat precies deze tekens, dus ze worden gekopieerd; het rapport wijst ze aan.mojibake_suspected

Het script in SQLite 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.

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

Refererende sleutels worden in elke tabel gedeclareerd en de rijen laden met de controle op refererende sleutels uit. Daarna somt het script elke rij op die naar een niet-bestaande rij verwijst, in plaats van halverwege te mislukken.

Laad een grote dump in een nieuw bestand op een lokale schijf. Het script laadt alles in één transactie met synchronisatie uit, dus het draait op schijfsnelheid, en een laadactie die halverwege stopt, laat geen halve tabellen achter.

De opdrachtregel laadt het bestand rechtstreeks in een SQLite-database, zonder een script te schrijven. Dat is gratis.

Een dump van SQL Server maken voor het beste resultaat

De converter leest wat de dump bevat. Met deze opties blijft er meer van je data in staan:

  • Klik in SSMS met rechts op de database, kies Tasks, Generate Scripts en selecteer de tabellen. dbatools, mssql-scripter en andere tools op basis van dezelfde bibliotheek schrijven hetzelfde script.
  • Zet onder Advanced Types of data to script op Schema and data. Een script van alleen het schema bevat tabellen zonder rijen.
  • Sla het op als Unicode, de standaard van SSMS, of als UTF-8: beide worden op dezelfde manier gelezen, en gzip werkt ook.

Wat niet wordt geconverteerd

Weergaven, functies, procedures, triggers, synoniemen, regels en beveiligingsbeleid zijn geschreven in T-SQL. Ze staan op naam in het rapport en worden nooit stilletjes weggelaten, zodat je ze kunt herschrijven voor SQLite.

Vragen over SQL Server naar SQLite

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.

Leest het het UTF-16-bestand dat SSMS opslaat?

Ja. SSMS slaat scripts standaard op als UTF-16, en de converter leest UTF-16 en UTF-8 even goed, met of zonder gzip, met GO tussen batches.

Van welke SQL Server-versies kan het script komen?

Scripts die SSMS, dbatools of mssql-scripter schrijven vanaf SQL Server 2017. Elk testscript komt van SQL Server 2017, 2022 en 2025 en wordt cel voor cel met zijn bron vergeleken.

Blijven IDENTITY-waarden behouden?

Een IDENTITY-kolom die de hele primaire sleutel van de tabel is, wordt INTEGER PRIMARY KEY AUTOINCREMENT, elke rij behoudt zijn id en het volgende id gaat verder na het hoogste. Elke andere behoudt zijn waarden zonder teller.

Wat gebeurt er met money, datetimeoffset en andere SQL Server-typen?

bit wordt 0 en 1, datetime2 ISO 8601-tekst met elk cijfer, datetimeoffset UTC-tekst, en brede decimals en money exacte tekst. Berekende kolommen blijven berekend. Schema's worden voorvoegsels van tabelnamen.

En procedures, triggers en weergaven?

Ze staan op naam in het rapport en worden niet geconverteerd, omdat elke database ze in een eigen taal schrijft.

Op welke SQLite-versies laadt het script?

SQLite 3.31 en later. Elk testscript laadt op 3.31 en 3.54 en stopt bij de eerste fout als er iets misgaat.