Aller au contenu
Accueil IntoSQL

Convertir SQL Server en PostgreSQL

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 PostgreSQL avec les mêmes tables, clés, index et données. Chaque valeur que PostgreSQL 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
    totalnumeric(19,4) not null
    itemssmallint not null
    ordered_attimestamp(0) not null
    shipped_attimestamp(6)
    notetext
    detailstext
    order_refuuid not null
    total_with_taxnumeric(12,2)
  • customers8 lignes1
    8 colonnes
    idinteger not null
    namevarchar(100) not null
    emailvarchar(200) not null
    countryvarchar(2) not null
    is_activeboolean not null
    signed_update
    created_attimestamptz(0) not null
    row_versionbytea

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 PostgreSQL.

-- Written by IntoSQL from a SQL Server dump. Load it with: psql -v ON_ERROR_STOP=1 -f <file>
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET synchronous_commit = off;
SET maintenance_work_mem = '512MB';

CREATE TABLE orders (
    id integer GENERATED BY DEFAULT AS IDENTITY NOT NULL,
    customer_id integer NOT NULL,
    status varchar(10) DEFAULT 'pending' NOT NULL,
    total numeric(19,4) NOT NULL,
    items smallint DEFAULT 1 NOT NULL,
    ordered_at timestamp(0) NOT NULL,
    shipped_at timestamp(6),
    note text,
    details text,
    order_ref uuid DEFAULT (gen_random_uuid()::text) NOT NULL,
    total_with_tax numeric(12,2) GENERATED ALWAYS AS ((cast(total * (1.16) AS numeric(12,2)))::numeric(12,2)) 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))
);

CREATE TABLE customers (
    id integer GENERATED BY DEFAULT AS IDENTITY NOT NULL,
    name varchar(100) NOT NULL,
    email varchar(200) NOT NULL,
    country varchar(2) DEFAULT 'US' NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    signed_up date,
    created_at timestamptz(0) DEFAULT CURRENT_TIMESTAMP NOT NULL,
    row_version bytea
);

COPY customers (id, name, email, country, is_active, signed_up, created_at) FROM stdin;
1	Ana Martínez	ana@example.com	MX	t	2023-01-15	2023-01-15 10:24:00.000000+00:00
2	Zoë Müller	zoe@example.de	DE	t	2023-02-03	2023-02-03 08:11:42.000000+00:00
3	José Peña	jose@example.es	ES	f	2023-03-21	2023-03-21 19:05:17.000000+00:00
4	李雷	lilei@example.cn	CN	t	2023-05-09	2023-05-09 02:40:00.000000+00:00
5	Noah O'Brien	noah@example.ie	IE	t	\N	2023-06-30 14:00:00.000000+00:00
6	Amélie Laurent	amelie@example.fr	FR	t	2024-01-02	2024-01-02 09:30:00.000000+00:00
7	Ravi Patel	ravi@example.in	IN	f	2024-02-29	2024-02-29 23:59:59.000000+00:00
8	Sofia Rossi 🌻	sofia@example.it	IT	t	2024-04-12	2024-04-12 12:12:12.000000+00:00
\.

COPY orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, order_ref) FROM stdin;
1	1	shipped	129.9000	3	2024-03-01T10:00:00.000000	2024-03-02T16:30:00.123456	\N	{"gift": false}	0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f
2	2	paid	54.0000	1	2024-03-02T11:15:00.000000	\N	Gift wrap 🎁	{"gift": true, "wrap": "red"}	1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70
3	1	cancelled	12.5000	1	2024-03-03T09:45:00.000000	\N	Customer changed their mind	\N	2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081
4	4	shipped	980.0000	12	2024-03-05T02:10:00.000000	2024-03-07T08:00:00.000000	请小心轻放	{"fragile": true}	3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192
5	5	pending	45.7500	2	2024-03-08T17:20:00.000000	\N	Leave at the door; ring twice	\N	4f1e806c-7d5b-4c2e-9a99-5e6f708192a3
6	6	shipped	310.4000	5	2024-03-10T13:00:00.000000	2024-03-11T09:00:00.000000	Fragile: "glass"	{"fragile": true}	50f2917d-8e6c-4d3f-8baa-6f708192a3b4
7	8	paid	76.2000	2	2024-03-11T18:45:00.000000	\N	\N	\N	6103a28e-9f7d-4e40-9cbb-708192a3b4c5
8	2	shipped	19.9900	1	2024-03-12T08:00:00.000000	9999-12-31T23:59:59.999999	Shipped date set to the maximum by an old import	\N	7214b39f-a08e-4f51-8dcc-8192a3b4c5d6
9	3	shipped	64.0000	2	2024-03-14T15:30:00.000000	2024-03-15T10:00:00.000000	Two parcels	{"parcels": [1, 2]}	8325c4a0-b19f-4062-9edd-92a3b4c5d6e7
10	7	paid	1499.0000	1	2024-03-15T21:05:00.000000	\N	C:\\Users\\ravi\\invoice.pdf	\N	9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8
\.


-- Keys, indexes and constraints, after the rows so each builds once.
CREATE UNIQUE INDEX orders_pkey ON orders (id);
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_pkey ON customers (id);
CREATE UNIQUE INDEX customers_email ON customers (email);
ALTER TABLE orders ADD CONSTRAINT orders_pkey PRIMARY KEY USING INDEX orders_pkey;
ALTER TABLE customers ADD CONSTRAINT customers_pkey PRIMARY KEY USING INDEX customers_pkey;
ALTER TABLE customers ADD CONSTRAINT customers_email UNIQUE USING INDEX customers_email;
ALTER TABLE orders ADD CONSTRAINT orders_fkey FOREIGN KEY (customer_id) REFERENCES customers (id) NOT VALID;
DO $f$ BEGIN
    ALTER TABLE orders VALIDATE CONSTRAINT orders_fkey;
EXCEPTION WHEN foreign_key_violation THEN
    RAISE WARNING 'foreign key % has rows without a parent: it stays NOT VALID, and new rows are checked', 'orders_fkey';
END $f$;
SELECT setval(pg_get_serial_sequence('orders', 'id'), LEAST(GREATEST(COALESCE((SELECT max(id) FROM orders)::numeric, 0) + 1, 1), 2147483647)::bigint, false);
SELECT setval(pg_get_serial_sequence('customers', 'id'), LEAST(GREATEST(COALESCE((SELECT max(id) FROM customers)::numeric, 0) + 1, 1), 2147483647)::bigint, false);
COMMENT ON TABLE customers IS 'People who bought at least once';

Corrections

  1. "items" de orders est non signée ; elle est donc devenue smallint avec un CHECK qui interdit les valeurs négatives.
  2. "shipped_at" de orders est datetime2(7), avec plus de chiffres de seconde que PostgreSQL n'en garde ; elle est donc en timestamp(6) et les derniers chiffres sont coupés.
  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 bytea et vide.

À vérifier

  • 6 colonnes de texte comparent sans tenir compte de la casse dans la source ; PostgreSQL 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 PostgreSQL.
  • La contrainte CHECK check1 sur orders ne peut pas être écrite pour PostgreSQL (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 PostgreSQL (filtered index) ; il n'est donc pas créé. Créez l'index à la main si les requêtes en ont besoin.

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

Autres exemples :

Ce qui change de SQL Server à PostgreSQL

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

    boolean

    bit contient 1 et 0, qui sont le true et le false de PostgreSQL.

  • tinyint

    smallint avec un CHECK qui interdit les négatifs

    Le tinyint de SQL Server va de 0 à 255 ; le plus petit entier de PostgreSQL est signé, donc 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

    Le text de PostgreSQL contient tous les caractères, donc varchar et nvarchar sont le même type.

  • decimal(p,s), money, smallmoney

    numeric(p,s) ; money en numeric(19,4)

    Chaque chiffre est gardé, money avec ses quatre décimales.

  • datetime, datetime2, smalldatetime

    timestamp(p)

    Un datetime est une date et une heure locales, comme un timestamp sans fuseau horaire.

  • datetime2(7), time(7) and datetimeoffset(7)

    six chiffres de seconde, le septième coupé

    PostgreSQL garde les microsecondes ; le septième chiffre (100 nanosecondes) est coupé, jamais arrondi, donc aucune valeur ne passe à la seconde ou au jour suivant.

    Ligne du rapport: fraction_cut

  • datetimeoffset

    timestamptz, les mêmes instants

    timestamptz garde l'instant ; PostgreSQL l'affiche dans le fuseau horaire de la session au lieu du décalage qu'avait chaque valeur.

  • time

    time(p)

    Les mêmes heures du jour.

  • json (SQL Server 2025)

    jsonb

    Les mêmes valeurs JSON.

  • uniqueidentifier

    uuid

    Les mêmes identifiants, écrits en minuscules.

  • binary, varbinary, image

    bytea

    Les octets restent des octets.

  • geometry, geography

    bytea 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

    bytea, 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

  • sql_variant, hierarchyid, vector

    text

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

    Ligne du rapport: type_replaced

  • collations that ignore case (_CI_)

    comparaison exacte

    PostgreSQL compare le texte exactement ; les colonnes insensibles à la casse dans SQL Server distinguent donc maintenant Ana et ana.

    Ligne du rapport: case_insensitive_collation

  • IDENTITY

    GENERATED BY DEFAULT AS IDENTITY, qui reprend après l'identifiant le plus élevé

    Les identifiants copiés se chargent tels quels, et le compteur reprend après le plus élevé.

  • CREATE SEQUENCE

    CREATE SEQUENCE avec les mêmes options

    Les séquences PostgreSQL fonctionnent de la même façon. SSMS n'écrit pas où en est une séquence, elle repart donc de sa valeur de création.

  • computed columns

    colonnes générées, STORED

    PostgreSQL 13 à 17 ne font que stocker les colonnes générées ; la formule est la même, avec CONCAT écrit pour que NULL compte comme vide, comme dans SQL Server.

    Ligne du rapport: virtual_as_stored

  • computed columns with functions PostgreSQL lacks

    une colonne simple

    Une formule qui ne peut pas être écrite pour PostgreSQL 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 PostgreSQL lacks, and NEXT VALUE FOR

    aucune valeur par défaut

    Une valeur par défaut qui ne peut pas être écrite pour PostgreSQL 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 PostgreSQL lacks

    non créée

    Une contrainte CHECK qui ne peut pas être écrite pour PostgreSQL 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 ; recréez les autres après le chargement.

    Ligne du rapport: index_skipped

  • foreign keys

    clés étrangères, après les lignes

    Les lignes se chargent dans tout ordre, puis les clés les vérifient.

  • 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 PostgreSQL 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 ; PostgreSQL ne garde pas l'historique de lui-même.

    Ligne du rapport: system_versioning_dropped

  • 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

  • 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

  • NUL characters in text

    retiré

    Le texte PostgreSQL ne peut pas contenir de caractère NUL. Il est retiré et le rapport compte les valeurs.

    Ligne du rapport: nul_removed

  • text that isn't valid in its encoding

    les octets invalides deviennent le caractère de remplacement

    Le texte PostgreSQL doit être de l'UTF-8 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 PostgreSQLLigne du rapport
bitbooleanbit contient 1 et 0, qui sont le true et le false de PostgreSQL.
tinyintsmallint avec un CHECK qui interdit les négatifsLe tinyint de SQL Server va de 0 à 255 ; le plus petit entier de PostgreSQL est signé, donc un CHECK garde sa plage.unsigned_widened
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), textvarchar(n) et textLe text de PostgreSQL contient tous les caractères, donc varchar et nvarchar sont le même type.
decimal(p,s), money, smallmoneynumeric(p,s) ; money en numeric(19,4)Chaque chiffre est gardé, money avec ses quatre décimales.
datetime, datetime2, smalldatetimetimestamp(p)Un datetime est une date et une heure locales, comme un timestamp sans fuseau horaire.
datetime2(7), time(7) and datetimeoffset(7)six chiffres de seconde, le septième coupéPostgreSQL garde les microsecondes ; le septième chiffre (100 nanosecondes) est coupé, jamais arrondi, donc aucune valeur ne passe à la seconde ou au jour suivant.fraction_cut
datetimeoffsettimestamptz, les mêmes instantstimestamptz garde l'instant ; PostgreSQL l'affiche dans le fuseau horaire de la session au lieu du décalage qu'avait chaque valeur.
timetime(p)Les mêmes heures du jour.
json (SQL Server 2025)jsonbLes mêmes valeurs JSON.
uniqueidentifieruuidLes mêmes identifiants, écrits en minuscules.
binary, varbinary, imagebyteaLes octets restent des octets.
geometry, geographybytea 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, timestampbytea, 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
sql_variant, hierarchyid, vectortextPostgreSQL n'a pas de type équivalent ; sql_variant garde le texte de chaque valeur et hierarchyid son chemin, comme /1/2/. xml reste xml.type_replaced
collations that ignore case (_CI_)comparaison exactePostgreSQL compare le texte exactement ; les colonnes insensibles à la casse dans SQL Server distinguent donc maintenant Ana et ana.case_insensitive_collation
IDENTITYGENERATED BY DEFAULT AS IDENTITY, qui reprend après l'identifiant le plus élevéLes identifiants copiés se chargent tels quels, et le compteur reprend après le plus élevé.
CREATE SEQUENCECREATE SEQUENCE avec les mêmes optionsLes séquences PostgreSQL fonctionnent de la même façon. SSMS n'écrit pas où en est une séquence, elle repart donc de sa valeur de création.
computed columnscolonnes générées, STOREDPostgreSQL 13 à 17 ne font que stocker les colonnes générées ; la formule est la même, avec CONCAT écrit pour que NULL compte comme vide, comme dans SQL Server.virtual_as_stored
computed columns with functions PostgreSQL lacksune colonne simpleUne formule qui ne peut pas être écrite pour PostgreSQL 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 PostgreSQL lacks, and NEXT VALUE FORaucune valeur par défautUne valeur par défaut qui ne peut pas être écrite pour PostgreSQL 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 PostgreSQL lacksnon crééeUne contrainte CHECK qui ne peut pas être écrite pour PostgreSQL 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 ; recréez les autres après le chargement.index_skipped
foreign keysclés étrangères, après les lignesLes lignes se chargent dans tout ordre, puis les clés les vérifient.
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 PostgreSQL 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 ; PostgreSQL ne garde pas l'historique de lui-même.system_versioning_dropped
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
dates that aren't validNULLUne valeur qui n'est pas une date devient NULL et le rapport la compte.date_out_of_range
NUL characters in textretiréLe texte PostgreSQL ne peut pas contenir de caractère NUL. Il est retiré et le rapport compte les valeurs.nul_removed
text that isn't valid in its encodingles octets invalides deviennent le caractère de remplacementLe texte PostgreSQL doit être de l'UTF-8 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 PostgreSQL

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.

psql -v ON_ERROR_STOP=1 -d mydb -f sql_server.postgresql.sql

Les clés étrangères sont ajoutées en NOT VALID, puis validées. Si une ligne pointe vers une ligne qui n'existe pas, le script vous indique quelle contrainte, au lieu d'échouer à mi-chemin.

Pour un gros dump, créez d'abord la base de données et exécutez le script avec psql depuis la machine du serveur.

IntoSQL Pro charge le fichier directement dans PostgreSQL depuis l'application de bureau ou la ligne de commande, sans écrire de script.

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 PostgreSQL.

Questions sur SQL Server vers PostgreSQL

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 ?

Oui. Les colonnes IDENTITY deviennent des colonnes d'identité, chaque ligne garde son identifiant, et le suivant reprend après le plus élevé. Les séquences sont créées avec les mêmes options.

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

bit devient boolean, money numeric(19,4), uniqueidentifier uuid, xml xml, et datetimeoffset timestamptz. datetime2 garde six chiffres de seconde, le septième coupé. Les colonnes insensibles à la casse se comparent exactement, et le rapport indique lesquelles.

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 PostgreSQL le script se charge-t-il ?

PostgreSQL 13 à 18. Le même script se charge sur chacune, et s'arrête à la première erreur en cas de problème.