Naar de inhoud
IntoSQL-startpagina

SQL Server omzetten naar PostgreSQL

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 PostgreSQL-script met dezelfde tabellen, sleutels, indexen en data. Elke waarde die PostgreSQL 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
    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 rijen1
    8 kolommen
    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

Niet geconverteerd

  • Weergave paid_orders
  • Trigger orders_no_negative

Elke database schrijft deze in een eigen taal. Herschrijf ze voor 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';

Correcties

  1. "items" van orders is unsigned, dus het is smallint geworden met een check dat het niet negatief is.
  2. "shipped_at" van orders is datetime2(7), met meer cijfers van een seconde dan PostgreSQL bewaart, dus het is timestamp(6) en de laatste cijfers worden afgekapt.
  3. "row_version" van customers is een rijversie die SQL Server zelf instelt; de dump heeft er geen waarden voor, dus het is bytea en leeg.

Na te kijken

  • 6 tekstkolommen vergelijken in de bron zonder op hoofdletters te letten; PostgreSQL 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 PostgreSQL.
  • De check check1 op orders kan niet voor PostgreSQL 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 PostgreSQL kan worden geschreven (filtered index), dus hij wordt niet aangemaakt. Maak de index met de hand aan als query's hem nodig hebben.

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

Andere voorbeelden:

Wat er verandert van SQL Server naar PostgreSQL

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

  • bit

    boolean

    bit bevat 1 en 0, wat in PostgreSQL true en false zijn.

  • tinyint

    smallint met een CHECK dat hij niet negatief is

    tinyint in SQL Server loopt van 0 tot 255; het kleinste gehele getal in PostgreSQL heeft een teken, dus een check bewaakt het bereik.

    Rapportregel: unsigned_widened

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

    varchar(n) en text

    text in PostgreSQL bevat elk teken, dus varchar en nvarchar zijn hetzelfde type.

  • decimal(p,s), money, smallmoney

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

    Elk cijfer blijft behouden, money met zijn vier decimalen.

  • datetime, datetime2, smalldatetime

    timestamp(p)

    Een datetime is een kloktijd, net als een timestamp zonder tijdzone.

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

    zes cijfers van een seconde, het zevende afgekapt

    PostgreSQL bewaart microseconden; het zevende cijfer (100 nanoseconden) wordt afgekapt, nooit afgerond, dus geen waarde schuift naar de volgende seconde of dag.

    Rapportregel: fraction_cut

  • datetimeoffset

    timestamptz, dezelfde momenten

    timestamptz behoudt het moment; PostgreSQL toont het in de tijdzone van de sessie in plaats van de offset die elke waarde had.

  • time

    time(p)

    Dezelfde tijdstippen van de dag.

  • json (SQL Server 2025)

    jsonb

    Dezelfde JSON-waarden.

  • uniqueidentifier

    uuid

    Dezelfde identifiers, in kleine letters geschreven.

  • binary, varbinary, image

    bytea

    Bytes blijven bytes.

  • geometry, geography

    bytea 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

    bytea, leeg

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

    Rapportregel: rowversion_empty

  • sql_variant, hierarchyid, vector

    text

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

    Rapportregel: type_replaced

  • collations that ignore case (_CI_)

    exacte vergelijking

    PostgreSQL vergelijkt tekst exact, dus kolommen die in SQL Server hoofdletters negeerden, onderscheiden nu Ana en ana.

    Rapportregel: case_insensitive_collation

  • IDENTITY

    GENERATED BY DEFAULT AS IDENTITY, verdergaand na het hoogste id

    De gekopieerde id's laden zoals ze zijn, en de teller gaat verder na het hoogste.

  • CREATE SEQUENCE

    CREATE SEQUENCE met dezelfde opties

    Sequences in PostgreSQL werken op dezelfde manier. SSMS neemt niet op in het script hoe ver een sequence is, dus hij begint waar hij is aangemaakt.

  • computed columns

    gegenereerde kolommen, STORED

    PostgreSQL 13 tot en met 17 slaan gegenereerde kolommen alleen op; de formule is dezelfde, met CONCAT zo geschreven dat NULL als leeg telt, zoals in SQL Server.

    Rapportregel: virtual_as_stored

  • computed columns with functions PostgreSQL lacks

    een gewone kolom

    Een formule die niet voor PostgreSQL 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 PostgreSQL lacks, and NEXT VALUE FOR

    geen standaardwaarde

    Een standaardwaarde die niet voor PostgreSQL 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 PostgreSQL lacks

    niet aangemaakt

    Een check die niet voor PostgreSQL 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 kolommen; maak de andere na het laden opnieuw aan.

    Rapportregel: index_skipped

  • foreign keys

    refererende sleutels, na de rijen

    De rijen laden in willekeurige volgorde, en de sleutels controleren ze daarna.

  • 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 PostgreSQL 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; PostgreSQL houdt de geschiedenis niet zelf bij.

    Rapportregel: system_versioning_dropped

  • 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

  • dates that aren't valid

    NULL

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

    Rapportregel: date_out_of_range

  • NUL characters in text

    verwijderd

    Tekst in PostgreSQL kan geen NUL-teken bevatten. Het wordt verwijderd en het rapport telt de waarden.

    Rapportregel: nul_removed

  • text that isn't valid in its encoding

    de foute bytes als het vervangingsteken

    Tekst in PostgreSQL moet geldige UTF-8 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 PostgreSQLRapportregel
bitbooleanbit bevat 1 en 0, wat in PostgreSQL true en false zijn.
tinyintsmallint met een CHECK dat hij niet negatief istinyint in SQL Server loopt van 0 tot 255; het kleinste gehele getal in PostgreSQL heeft een teken, dus een check bewaakt het bereik.unsigned_widened
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), textvarchar(n) en texttext in PostgreSQL bevat elk teken, dus varchar en nvarchar zijn hetzelfde type.
decimal(p,s), money, smallmoneynumeric(p,s); money als numeric(19,4)Elk cijfer blijft behouden, money met zijn vier decimalen.
datetime, datetime2, smalldatetimetimestamp(p)Een datetime is een kloktijd, net als een timestamp zonder tijdzone.
datetime2(7), time(7) and datetimeoffset(7)zes cijfers van een seconde, het zevende afgekaptPostgreSQL bewaart microseconden; het zevende cijfer (100 nanoseconden) wordt afgekapt, nooit afgerond, dus geen waarde schuift naar de volgende seconde of dag.fraction_cut
datetimeoffsettimestamptz, dezelfde momententimestamptz behoudt het moment; PostgreSQL toont het in de tijdzone van de sessie in plaats van de offset die elke waarde had.
timetime(p)Dezelfde tijdstippen van de dag.
json (SQL Server 2025)jsonbDezelfde JSON-waarden.
uniqueidentifieruuidDezelfde identifiers, in kleine letters geschreven.
binary, varbinary, imagebyteaBytes blijven bytes.
geometry, geographybytea 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, timestampbytea, leegSQL Server stelt een rijversie zelf in en SSMS neemt er geen waarden voor op in het script.rowversion_empty
sql_variant, hierarchyid, vectortextPostgreSQL heeft geen gelijkwaardig type; sql_variant behoudt de tekst van elke waarde en hierarchyid zijn pad, zoals /1/2/. xml blijft xml.type_replaced
collations that ignore case (_CI_)exacte vergelijkingPostgreSQL vergelijkt tekst exact, dus kolommen die in SQL Server hoofdletters negeerden, onderscheiden nu Ana en ana.case_insensitive_collation
IDENTITYGENERATED BY DEFAULT AS IDENTITY, verdergaand na het hoogste idDe gekopieerde id's laden zoals ze zijn, en de teller gaat verder na het hoogste.
CREATE SEQUENCECREATE SEQUENCE met dezelfde optiesSequences in PostgreSQL werken op dezelfde manier. SSMS neemt niet op in het script hoe ver een sequence is, dus hij begint waar hij is aangemaakt.
computed columnsgegenereerde kolommen, STOREDPostgreSQL 13 tot en met 17 slaan gegenereerde kolommen alleen op; de formule is dezelfde, met CONCAT zo geschreven dat NULL als leeg telt, zoals in SQL Server.virtual_as_stored
computed columns with functions PostgreSQL lackseen gewone kolomEen formule die niet voor PostgreSQL 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 PostgreSQL lacks, and NEXT VALUE FORgeen standaardwaardeEen standaardwaarde die niet voor PostgreSQL kan worden geschreven, wordt weggelaten en gemeld.default_not_translated
CHECK constraintsvertaaldDezelfde checks, getest terwijl elke rij laadt.
CHECK constraints with functions PostgreSQL lacksniet aangemaaktEen check die niet voor PostgreSQL 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 kolommen; maak de andere na het laden opnieuw aan.index_skipped
foreign keysrefererende sleutels, na de rijenDe rijen laden in willekeurige volgorde, en de sleutels controleren ze daarna.
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 PostgreSQL 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; PostgreSQL houdt de geschiedenis niet zelf bij.system_versioning_dropped
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
dates that aren't validNULLEen waarde die geen datum is, wordt NULL en het rapport telt hem.date_out_of_range
NUL characters in textverwijderdTekst in PostgreSQL kan geen NUL-teken bevatten. Het wordt verwijderd en het rapport telt de waarden.nul_removed
text that isn't valid in its encodingde foute bytes als het vervangingstekenTekst in PostgreSQL moet geldige UTF-8 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 PostgreSQL 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.

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

Refererende sleutels worden toegevoegd als NOT VALID en daarna gevalideerd. Verwijst een rij naar een rij die niet bestaat, dan vertelt het script je welke constraint het is, in plaats van halverwege te mislukken.

Maak voor een grote dump eerst de database aan en voer het script uit met psql vanaf dezelfde machine als de server.

IntoSQL Pro laadt het bestand rechtstreeks in PostgreSQL vanuit de desktopapp of de opdrachtregel, zonder een script te schrijven.

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

Vragen over SQL Server naar PostgreSQL

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?

Ja. IDENTITY-kolommen worden identity-kolommen, elke rij behoudt zijn id en het volgende id gaat verder na het hoogste. Sequences worden aangemaakt met dezelfde opties.

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

bit wordt boolean, money numeric(19,4), uniqueidentifier uuid, xml xml en datetimeoffset timestamptz. datetime2 behoudt zes cijfers van een seconde, het zevende valt weg. Kolommen die hoofdletters negeerden, vergelijken exact, en het rapport zegt welke.

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 PostgreSQL-versies laadt het script?

PostgreSQL 13 tot en met 18. Hetzelfde script laadt op elk ervan en stopt bij de eerste fout als er iets misgaat.