Aller au contenu
Accueil IntoSQL

Convertir SQL Server en SQLite

Déposez le script que Generate Scripts de SSMS écrit avec le schéma et les données, en .sql ou .sql.gz, UTF-16 ou UTF-8, et téléchargez un script SQLite avec les mêmes tables, clés, index et données. Chaque valeur que SQLite ne peut pas contenir telle quelle, et chaque objet qu'il ne reprend pas, est listé dans le rapport.

Votre fichier
sqlshop_2024_sqlserver.sqlFichier d'exemple, 11 ko
Votre base de données

18 lignes converties, 3 corrections, aucune rejetée

Afficher

Tables de shop_2024_sqlserver.sqlDump SQL Server · écrit par SQL Server Management Objects · utf-8

  • orders10 lignes2
    11 colonnes
    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 lignes1
    8 colonnes
    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

Non converti

  • Vue paid_orders
  • Déclencheur orders_no_negative

Chaque base de données les écrit dans son propre langage. Réécrivez-les pour 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;

Corrections

  1. "items" de orders est non signée ; elle est donc devenue INTEGER avec un CHECK qui interdit les valeurs négatives.
  2. "total" de orders est money, plus de chiffres qu'un nombre SQLite n'en garde ; elle est donc en texte avec tous ses chiffres.
  3. "row_version" de customers est une version de ligne que SQL Server définit lui-même ; le dump n'a aucune valeur pour elle, elle est donc en BLOB et vide.

À vérifier

  • 6 colonnes de texte comparent sans tenir compte de la casse dans la source ; SQLite compare exactement, donc les clés uniques et les recherches peuvent se comporter autrement. Utilisez une collation ou un type de colonne insensible à la casse sur les colonnes qui en ont besoin.
  • 2 objets non convertis (vues, déclencheurs, routines ou événements) ; le rapport les liste un par un. Recréez-les à la main dans SQLite.
  • La contrainte CHECK check1 sur orders ne peut pas être écrite pour SQLite (function isjson) ; elle n'est donc pas créée. Écrivez la contrainte à la main si elle compte.
  • L'index idx_orders_pending sur orders utilise une expression qui ne peut pas être écrite pour SQLite (filtered index) ; il n'est donc pas créé. Créez l'index à la main si les requêtes en ont besoin.
  • La valeur par défaut de "order_ref" dans orders ne peut pas être écrite pour SQLite (function uuid) ; la colonne n'a donc pas de valeur par défaut. Ajoutez la valeur par défaut à la main si les nouvelles lignes en ont besoin.

Votre fichier est converti sur cet ordinateur et n'est jamais envoyé.

Autres exemples :

Ce qui change de SQL Server à SQLite

Chaque ligne est une règle appliquée par le convertisseur, avec la ligne de rapport qu'il écrit quand la règle change quelque chose dans vos données.

  • bit

    INTEGER 0 ou 1 avec un CHECK

    SQLite n'a pas de type booléen ; ses propres true et false valent 1 et 0.

  • tinyint

    INTEGER avec un CHECK qui interdit les négatifs

    Le tinyint de SQL Server va de 0 à 255 ; un CHECK garde sa plage.

    Ligne du rapport: unsigned_widened

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

    VARCHAR(n) et TEXT, non appliqués

    SQLite garde le type déclaré pour les outils mais ne limite pas la longueur.

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

    TEXT

    SQLite garde environ 15 chiffres significatifs dans un nombre. Les nombres plus larges sont gardés en texte pour que chaque chiffre reste exact.

    Ligne du rapport: decimal_as_text

  • date, datetime, datetime2, smalldatetime

    DATETIME en texte ISO 8601, chaque chiffre gardé

    SQLite stocke les dates en texte que ses fonctions de date savent lire.

  • datetimeoffset

    TIMESTAMP en texte ISO 8601 en UTC

    SQLite n'a aucun type qui garde un décalage ; chaque instant est donc écrit en UTC : le même instant quel que soit son décalage.

    Ligne du rapport: moments_as_utc

  • time

    TIME en texte

    SQLite garde les heures en texte, avec chaque chiffre.

  • dates that aren't valid

    NULL

    Une valeur qui n'est pas une date devient NULL et le rapport la compte.

    Ligne du rapport: date_out_of_range

  • json (SQL Server 2025)

    TEXT

    Les mêmes valeurs JSON, que lisent les fonctions JSON de SQLite.

  • uniqueidentifier

    TEXT

    Les mêmes identifiants, écrits en minuscules.

  • binary, varbinary, image

    BLOB

    Les octets restent des octets.

  • geometry, geography

    BLOB avec les octets propres à SQL Server

    SSMS écrit les valeurs spatiales dans la sérialisation de SQL Server, qui est gardée octet par octet.

    Ligne du rapport: spatial_as_native

  • rowversion, timestamp

    BLOB, sans valeurs

    SQL Server définit lui-même la version de ligne et SSMS n'écrit aucune valeur pour elle dans le script.

    Ligne du rapport: rowversion_empty

  • xml, sql_variant, hierarchyid, vector

    TEXT

    SQLite n'a pas de type équivalent ; xml et sql_variant gardent le texte de chaque valeur et hierarchyid son chemin, comme /1/2/.

    Ligne du rapport: type_replaced

  • collations that ignore case (_CI_)

    comparaison exacte

    SQLite compare le texte exactement sauf indication contraire, et son NOCASE ne traite que les lettres ASCII.

    Ligne du rapport: case_insensitive_collation

  • IDENTITY

    INTEGER PRIMARY KEY AUTOINCREMENT, qui reprend après l'identifiant le plus élevé

    SQLite compte une clé primaire entière de type entier, et AUTOINCREMENT empêche de réutiliser les identifiants.

  • IDENTITY columns that aren't the whole primary key

    INTEGER sans compteur

    SQLite ne compte qu'une colonne qui forme toute la clé primaire ; la colonne garde donc ses valeurs et les nouvelles lignes doivent fournir les leurs.

    Ligne du rapport: counter_dropped

  • CREATE SEQUENCE

    non créée

    SQLite n'a pas de séquences. Les valeurs qu'une séquence a fournies sont dans les lignes.

    Ligne du rapport: sequence_not_converted

  • computed columns

    GENERATED ALWAYS AS, STORED si PERSISTED, VIRTUAL sinon

    SQLite 3.31 et versions ultérieures les calculent des deux mêmes façons, avec CONCAT écrit pour que NULL compte comme vide, comme dans SQL Server.

  • computed columns with functions SQLite lacks

    une colonne simple

    Une formule qui ne peut pas être écrite laisse une colonne simple et une ligne dans le rapport ; SSMS n'écrit aucune valeur pour les colonnes calculées.

    Ligne du rapport: generated_not_translated

  • defaults with functions SQLite lacks, and NEXT VALUE FOR

    aucune valeur par défaut

    Une valeur par défaut qui ne peut pas être écrite est omise et signalée.

    Ligne du rapport: default_not_translated

  • CHECK constraints

    traduites

    Les mêmes contraintes CHECK, vérifiées au chargement de chaque ligne.

  • CHECK constraints with functions SQLite lacks

    non créée

    Une contrainte CHECK qui ne peut pas être écrite est omise et signalée.

    Ligne du rapport: check_skipped

  • CHECK constraints added WITH NOCHECK or disabled

    non créée

    SQL Server n'applique pas ces contraintes CHECK, donc les lignes peuvent les enfreindre.

    Ligne du rapport: check_not_enforced

  • filtered and columnstore indexes

    non créée

    IntoSQL écrit des index b-tree sur des colonnes entières ; recréez les autres après le chargement.

    Ligne du rapport: index_skipped

  • foreign keys

    dans CREATE TABLE, chargées sans vérification, puis listées par PRAGMA foreign_key_check

    SQLite n'accepte les clés étrangères que dans CREATE TABLE et ne les vérifie qu'avec PRAGMA foreign_keys activé. Les lignes se chargent sans vérification et le script finit en listant toute ligne sans parent.

  • foreign keys to tables the dump doesn't create

    non créée

    Une clé ne peut pas désigner une table absente.

    Ligne du rapport: foreign_key_skipped

  • tables on a partition scheme

    une seule table avec les lignes de chaque partition

    Les lignes sont les mêmes ; partitionnez à nouveau la table dans SQLite si besoin.

    Ligne du rapport: partitions_dropped

  • temporal tables (SYSTEM_VERSIONING)

    deux tables : les lignes actuelles et l'historique

    La table et sa table d'historique sont copiées comme tables simples ; SQLite ne garde pas l'historique de lui-même.

    Ligne du rapport: system_versioning_dropped

  • schemas

    un seul fichier, tables préfixées par le nom de leur schéma

    Un fichier SQLite est une seule base de données ; le nom du schéma distingue donc les tables de même nom, et celles de dbo gardent leur nom.

    Ligne du rapport: schemas_merged

  • NOT NULL columns with values that become NULL

    NOT NULL retiré

    Une colonne dont des valeurs ont dû devenir NULL ne peut pas garder NOT NULL, sinon le chargement s'arrêterait.

    Ligne du rapport: not_null_relaxed

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

    listés dans le rapport

    Leur code est écrit en T-SQL ; ils sont donc listés pour que vous les recréiez.

    Ligne du rapport: not_converted_objects

  • scripts without CREATE TABLE (data only)

    types déduits des valeurs

    Un script de données seules ne contient que des lignes, donc les types viennent des valeurs.

    Ligne du rapport: no_schema

  • expressions in INSERT values

    NULL

    Un convertisseur qui n'exécute pas de base de données ne peut pas les évaluer.

    Ligne du rapport: expression_value

  • types IntoSQL doesn't know

    TEXT

    Le texte contient n'importe quelle valeur ; changez le type après le chargement.

    Ligne du rapport: unknown_type

  • NUL characters in text

    conservé

    Le texte SQLite peut contenir un caractère NUL, donc la valeur est copiée telle quelle.

  • text that isn't valid in its encoding

    les octets invalides deviennent le caractère de remplacement

    Le script est en UTF-8 et chaque valeur doit être du texte valide.

    Ligne du rapport: invalid_utf8_replaced

  • text decoded twice (ñ)

    copié tel quel

    Le script contient exactement ces caractères, ils sont donc copiés ; le rapport les signale.

    Ligne du rapport: mojibake_suspected

Dans SQL ServerDans SQLiteLigne du rapport
bitINTEGER 0 ou 1 avec un CHECKSQLite n'a pas de type booléen ; ses propres true et false valent 1 et 0.
tinyintINTEGER avec un CHECK qui interdit les négatifsLe tinyint de SQL Server va de 0 à 255 ; un CHECK garde sa plage.unsigned_widened
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), textVARCHAR(n) et TEXT, non appliquésSQLite garde le type déclaré pour les outils mais ne limite pas la longueur.
decimal(p,s) past 15 digits, moneyTEXTSQLite garde environ 15 chiffres significatifs dans un nombre. Les nombres plus larges sont gardés en texte pour que chaque chiffre reste exact.decimal_as_text
date, datetime, datetime2, smalldatetimeDATETIME en texte ISO 8601, chaque chiffre gardéSQLite stocke les dates en texte que ses fonctions de date savent lire.
datetimeoffsetTIMESTAMP en texte ISO 8601 en UTCSQLite n'a aucun type qui garde un décalage ; chaque instant est donc écrit en UTC : le même instant quel que soit son décalage.moments_as_utc
timeTIME en texteSQLite garde les heures en texte, avec chaque chiffre.
dates that aren't validNULLUne valeur qui n'est pas une date devient NULL et le rapport la compte.date_out_of_range
json (SQL Server 2025)TEXTLes mêmes valeurs JSON, que lisent les fonctions JSON de SQLite.
uniqueidentifierTEXTLes mêmes identifiants, écrits en minuscules.
binary, varbinary, imageBLOBLes octets restent des octets.
geometry, geographyBLOB avec les octets propres à SQL ServerSSMS écrit les valeurs spatiales dans la sérialisation de SQL Server, qui est gardée octet par octet.spatial_as_native
rowversion, timestampBLOB, sans valeursSQL Server définit lui-même la version de ligne et SSMS n'écrit aucune valeur pour elle dans le script.rowversion_empty
xml, sql_variant, hierarchyid, vectorTEXTSQLite n'a pas de type équivalent ; xml et sql_variant gardent le texte de chaque valeur et hierarchyid son chemin, comme /1/2/.type_replaced
collations that ignore case (_CI_)comparaison exacteSQLite compare le texte exactement sauf indication contraire, et son NOCASE ne traite que les lettres ASCII.case_insensitive_collation
IDENTITYINTEGER PRIMARY KEY AUTOINCREMENT, qui reprend après l'identifiant le plus élevéSQLite compte une clé primaire entière de type entier, et AUTOINCREMENT empêche de réutiliser les identifiants.
IDENTITY columns that aren't the whole primary keyINTEGER sans compteurSQLite ne compte qu'une colonne qui forme toute la clé primaire ; la colonne garde donc ses valeurs et les nouvelles lignes doivent fournir les leurs.counter_dropped
CREATE SEQUENCEnon crééeSQLite n'a pas de séquences. Les valeurs qu'une séquence a fournies sont dans les lignes.sequence_not_converted
computed columnsGENERATED ALWAYS AS, STORED si PERSISTED, VIRTUAL sinonSQLite 3.31 et versions ultérieures les calculent des deux mêmes façons, avec CONCAT écrit pour que NULL compte comme vide, comme dans SQL Server.
computed columns with functions SQLite lacksune colonne simpleUne formule qui ne peut pas être écrite laisse une colonne simple et une ligne dans le rapport ; SSMS n'écrit aucune valeur pour les colonnes calculées.generated_not_translated
defaults with functions SQLite lacks, and NEXT VALUE FORaucune valeur par défautUne valeur par défaut qui ne peut pas être écrite est omise et signalée.default_not_translated
CHECK constraintstraduitesLes mêmes contraintes CHECK, vérifiées au chargement de chaque ligne.
CHECK constraints with functions SQLite lacksnon crééeUne contrainte CHECK qui ne peut pas être écrite est omise et signalée.check_skipped
CHECK constraints added WITH NOCHECK or disablednon crééeSQL Server n'applique pas ces contraintes CHECK, donc les lignes peuvent les enfreindre.check_not_enforced
filtered and columnstore indexesnon crééeIntoSQL écrit des index b-tree sur des colonnes entières ; recréez les autres après le chargement.index_skipped
foreign keysdans CREATE TABLE, chargées sans vérification, puis listées par PRAGMA foreign_key_checkSQLite n'accepte les clés étrangères que dans CREATE TABLE et ne les vérifie qu'avec PRAGMA foreign_keys activé. Les lignes se chargent sans vérification et le script finit en listant toute ligne sans parent.
foreign keys to tables the dump doesn't createnon crééeUne clé ne peut pas désigner une table absente.foreign_key_skipped
tables on a partition schemeune seule table avec les lignes de chaque partitionLes lignes sont les mêmes ; partitionnez à nouveau la table dans SQLite si besoin.partitions_dropped
temporal tables (SYSTEM_VERSIONING)deux tables : les lignes actuelles et l'historiqueLa table et sa table d'historique sont copiées comme tables simples ; SQLite ne garde pas l'historique de lui-même.system_versioning_dropped
schemasun seul fichier, tables préfixées par le nom de leur schémaUn fichier SQLite est une seule base de données ; le nom du schéma distingue donc les tables de même nom, et celles de dbo gardent leur nom.schemas_merged
NOT NULL columns with values that become NULLNOT NULL retiréUne colonne dont des valeurs ont dû devenir NULL ne peut pas garder NOT NULL, sinon le chargement s'arrêterait.not_null_relaxed
views, functions, procedures, triggers, synonyms, types and partition functionslistés dans le rapportLeur code est écrit en T-SQL ; ils sont donc listés pour que vous les recréiez.not_converted_objects
scripts without CREATE TABLE (data only)types déduits des valeursUn script de données seules ne contient que des lignes, donc les types viennent des valeurs.no_schema
expressions in INSERT valuesNULLUn convertisseur qui n'exécute pas de base de données ne peut pas les évaluer.expression_value
types IntoSQL doesn't knowTEXTLe texte contient n'importe quelle valeur ; changez le type après le chargement.unknown_type
NUL characters in textconservéLe texte SQLite peut contenir un caractère NUL, donc la valeur est copiée telle quelle.
text that isn't valid in its encodingles octets invalides deviennent le caractère de remplacementLe script est en UTF-8 et chaque valeur doit être du texte valide.invalid_utf8_replaced
text decoded twice (ñ)copié tel quelLe script contient exactement ces caractères, ils sont donc copiés ; le rapport les signale.mojibake_suspected

Charger le script dans SQLite

Le script crée les tables, copie les lignes, puis ajoute les clés, les index et les clés étrangères ; il se charge donc vite et s'arrête à la première erreur.

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

Les clés étrangères sont déclarées dans chaque table et les lignes se chargent sans vérification des clés étrangères. Le script liste ensuite toute ligne qui pointe vers une ligne qui n'existe pas, au lieu d'échouer à mi-chemin.

Pour un gros dump, chargez-le dans un nouveau fichier sur un disque local. Le script charge tout dans une seule transaction sans synchronisation, il va donc à la vitesse du disque, et un chargement interrompu ne laisse aucune table partielle.

La ligne de commande charge le fichier directement dans une base SQLite, sans écrire de script. C'est gratuit.

Faire le dump SQL Server pour un meilleur résultat

Le convertisseur lit ce que contient le dump. Ces options y gardent davantage de vos données :

  • Dans SSMS, faites un clic droit sur la base de données, Tasks, Generate Scripts, et choisissez les tables. dbatools, mssql-scripter et les autres outils construits sur la même bibliothèque écrivent le même script.
  • Sous Advanced, réglez Types of data to script sur Schema and data. Un script du schéma seul contient des tables sans lignes.
  • Enregistrez-le en Unicode, le format par défaut de SSMS, ou en UTF-8 : les deux se lisent de la même façon, et gzip fonctionne aussi.

Ce qui n'est pas converti

Les vues, fonctions, procédures, déclencheurs, synonymes, règles et politiques de sécurité sont écrits en T-SQL. Ils sont listés par nom dans le rapport, jamais supprimés en silence, pour que vous puissiez les réécrire pour SQLite.

Questions sur SQL Server vers SQLite

Pas de réponse ici ? Écrivez-nous depuis la page de contact, une personne vous répond. Page de contact

Mon dump est-il envoyé ?

Non. Le convertisseur s'exécute dans votre navigateur et lit le dump depuis votre disque par morceaux ; il ne quitte donc jamais votre ordinateur. L'application de bureau et la ligne de commande convertissent aussi sur votre ordinateur.

Quelle taille peut avoir le dump ?

Le convertisseur ne garde jamais tout le dump en mémoire : il lit le fichier deux fois, par plages, et écrit le script au fur et à mesure. Les dumps de plusieurs gigaoctets se convertissent dans le navigateur, dans l'application de bureau et avec la ligne de commande.

Lit-il le fichier UTF-16 qu'enregistre SSMS ?

Oui. SSMS enregistre les scripts en UTF-16 par défaut, et le convertisseur lit l'UTF-16 comme l'UTF-8, compressés en gzip ou non, avec GO entre les lots.

De quelles versions de SQL Server le script peut-il venir ?

Les scripts que SSMS, dbatools ou mssql-scripter écrivent depuis SQL Server 2017. Chaque script de test vient de SQL Server 2017, 2022 et 2025 et est comparé à sa source cellule par cellule.

Les valeurs IDENTITY sont-elles gardées ?

Une colonne IDENTITY qui forme toute la clé primaire de la table devient INTEGER PRIMARY KEY AUTOINCREMENT, chaque ligne garde son identifiant, et le suivant reprend après le plus élevé. Toute autre garde ses valeurs sans compteur.

Que deviennent money, datetimeoffset et les autres types SQL Server ?

bit devient 0 et 1, datetime2 du texte ISO 8601 avec chaque chiffre, datetimeoffset du texte UTC, et les décimaux larges et money du texte exact. Les colonnes calculées restent calculées. Les schémas deviennent des préfixes de noms de tables.

Et les procédures, les déclencheurs et les vues ?

Ils sont listés par nom dans le rapport et ne sont pas convertis, car chaque base de données les écrit dans son propre langage.

Sur quelles versions de SQLite le script se charge-t-il ?

SQLite 3.31 et versions ultérieures. Chaque script de test se charge sur 3.31 et 3.54, et s'arrête à la première erreur en cas de problème.