Zum Inhalt springen
IntoSQL-Startseite

SQL Server in PostgreSQL umwandeln

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

Deine Datei
sqlshop_2024_sqlserver.sqlBeispieldatei, 11 kB
Deine Datenbank

18 Zeilen konvertiert, 3 Korrekturen, keine abgelehnt

Anzeigen

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

  • orders10 Zeilen2
    11 Spalten
    idinteger not null
    customer_idinteger not null
    statusvarchar(10) not null
    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 Zeilen1
    8 Spalten
    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

Nicht konvertiert

  • Sicht paid_orders
  • Trigger orders_no_negative

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

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

Korrekturen

  1. "items" von orders ist vorzeichenlos und wurde deshalb smallint mit einer CHECK-Bedingung gegen negative Werte.
  2. "shipped_at" von orders ist datetime2(7), mit mehr Sekundenstellen, als PostgreSQL behält, daher ist es timestamp(6) und die letzten Stellen werden abgeschnitten.
  3. "row_version" von customers ist eine Zeilenversion, die SQL Server selbst setzt; der Dump hat keine Werte dafür, daher ist es bytea und leer.

Zu prüfen

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

Deine Datei wird auf diesem Computer umgewandelt und nie hochgeladen.

Weitere Beispiele:

Was sich von SQL Server zu PostgreSQL ändert

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

  • bit

    boolean

    bit speichert 1 und 0, also true und false in PostgreSQL.

  • tinyint

    smallint mit einem CHECK, dass er nicht negativ ist

    tinyint in SQL Server reicht von 0 bis 255; die kleinste Ganzzahl in PostgreSQL ist vorzeichenbehaftet, daher hält ein CHECK den Bereich.

    Berichtszeile: unsigned_widened

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

    varchar(n) und text

    text in PostgreSQL fasst jedes Zeichen, daher sind varchar und nvarchar derselbe Typ.

  • decimal(p,s), money, smallmoney

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

    Jede Stelle bleibt erhalten, money mit seinen vier Nachkommastellen.

  • datetime, datetime2, smalldatetime

    timestamp(p)

    Ein datetime ist eine Uhrzeitangabe ohne Zeitzone, wie ein timestamp without time zone.

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

    sechs Sekundenstellen, die siebte abgeschnitten

    PostgreSQL behält Mikrosekunden; die siebte Stelle (100 Nanosekunden) wird abgeschnitten, nie gerundet, damit kein Wert in die nächste Sekunde oder den nächsten Tag rutscht.

    Berichtszeile: fraction_cut

  • datetimeoffset

    timestamptz, dieselben Zeitpunkte

    timestamptz behält den Zeitpunkt; PostgreSQL zeigt ihn in der Zeitzone der Sitzung statt mit dem Versatz, den jeder Wert hatte.

  • time

    time(p)

    Dieselben Uhrzeiten.

  • json (SQL Server 2025)

    jsonb

    Dieselben JSON-Werte.

  • uniqueidentifier

    uuid

    Dieselben Kennungen, in Kleinbuchstaben geschrieben.

  • binary, varbinary, image

    bytea

    Bytes bleiben Bytes.

  • geometry, geography

    bytea mit den eigenen Bytes von SQL Server

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

    Berichtszeile: spatial_as_native

  • rowversion, timestamp

    bytea, leer

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

    Berichtszeile: rowversion_empty

  • sql_variant, hierarchyid, vector

    text

    PostgreSQL hat keinen entsprechenden Typ; sql_variant behält den Text jedes Werts und hierarchyid seinen Pfad, etwa /1/2/. xml bleibt xml.

    Berichtszeile: type_replaced

  • collations that ignore case (_CI_)

    exakter Vergleich

    PostgreSQL vergleicht Text exakt, daher unterscheiden Spalten, die in SQL Server die Groß-/Kleinschreibung ignorierten, jetzt Ana und ana.

    Berichtszeile: case_insensitive_collation

  • IDENTITY

    GENERATED BY DEFAULT AS IDENTITY, weiter nach der höchsten ID

    Die kopierten IDs laden unverändert, und der Zähler macht nach der höchsten weiter.

  • CREATE SEQUENCE

    CREATE SEQUENCE mit denselben Optionen

    Sequenzen in PostgreSQL funktionieren genauso. SSMS schreibt nicht ins Skript, wie weit eine Sequenz gekommen ist, daher beginnt sie dort, wo sie angelegt wurde.

  • computed columns

    generierte Spalten, STORED

    PostgreSQL 13 bis 17 speichern generierte Spalten nur; die Formel ist dieselbe, mit CONCAT so geschrieben, dass NULL wie in SQL Server als leer zählt.

    Berichtszeile: virtual_as_stored

  • computed columns with functions PostgreSQL lacks

    eine normale Spalte

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

    Berichtszeile: generated_not_translated

  • defaults with functions PostgreSQL lacks, and NEXT VALUE FOR

    kein Standardwert

    Ein Standardwert, der sich nicht für PostgreSQL schreiben lässt, wird weggelassen und gemeldet.

    Berichtszeile: default_not_translated

  • CHECK constraints

    übersetzt

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

  • CHECK constraints with functions PostgreSQL lacks

    nicht angelegt

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

    Berichtszeile: check_skipped

  • CHECK constraints added WITH NOCHECK or disabled

    nicht angelegt

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

    Berichtszeile: check_not_enforced

  • filtered and columnstore indexes

    nicht angelegt

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

    Berichtszeile: index_skipped

  • foreign keys

    Fremdschlüssel, nach den Zeilen

    Die Zeilen laden in beliebiger Reihenfolge, und die Schlüssel prüfen sie danach.

  • foreign keys to tables the dump doesn't create

    nicht angelegt

    Ein Schlüssel kann nicht auf eine Tabelle verweisen, die es nicht gibt.

    Berichtszeile: foreign_key_skipped

  • tables on a partition scheme

    eine Tabelle mit den Zeilen aller Partitionen

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

    Berichtszeile: partitions_dropped

  • temporal tables (SYSTEM_VERSIONING)

    zwei Tabellen: die aktuellen Zeilen und die Historie

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

    Berichtszeile: system_versioning_dropped

  • NOT NULL columns with values that become NULL

    NOT NULL entfernt

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

    Berichtszeile: not_null_relaxed

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

    im Bericht aufgeführt

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

    Berichtszeile: not_converted_objects

  • scripts without CREATE TABLE (data only)

    Typen aus den Werten gelesen

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

    Berichtszeile: no_schema

  • expressions in INSERT values

    NULL

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

    Berichtszeile: expression_value

  • types IntoSQL doesn't know

    text

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

    Berichtszeile: unknown_type

  • dates that aren't valid

    NULL

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

    Berichtszeile: date_out_of_range

  • NUL characters in text

    entfernt

    Text in PostgreSQL kann kein NUL-Zeichen enthalten. Es wird entfernt, und der Bericht zählt die Werte.

    Berichtszeile: nul_removed

  • text that isn't valid in its encoding

    die fehlerhaften Bytes als Ersatzzeichen

    Text in PostgreSQL muss gültiges UTF-8 sein.

    Berichtszeile: invalid_utf8_replaced

  • text decoded twice (ñ)

    unverändert kopiert

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

    Berichtszeile: mojibake_suspected

In SQL ServerIn PostgreSQLBerichtszeile
bitbooleanbit speichert 1 und 0, also true und false in PostgreSQL.
tinyintsmallint mit einem CHECK, dass er nicht negativ isttinyint in SQL Server reicht von 0 bis 255; die kleinste Ganzzahl in PostgreSQL ist vorzeichenbehaftet, daher hält ein CHECK den Bereich.unsigned_widened
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), textvarchar(n) und texttext in PostgreSQL fasst jedes Zeichen, daher sind varchar und nvarchar derselbe Typ.
decimal(p,s), money, smallmoneynumeric(p,s); money als numeric(19,4)Jede Stelle bleibt erhalten, money mit seinen vier Nachkommastellen.
datetime, datetime2, smalldatetimetimestamp(p)Ein datetime ist eine Uhrzeitangabe ohne Zeitzone, wie ein timestamp without time zone.
datetime2(7), time(7) and datetimeoffset(7)sechs Sekundenstellen, die siebte abgeschnittenPostgreSQL behält Mikrosekunden; die siebte Stelle (100 Nanosekunden) wird abgeschnitten, nie gerundet, damit kein Wert in die nächste Sekunde oder den nächsten Tag rutscht.fraction_cut
datetimeoffsettimestamptz, dieselben Zeitpunktetimestamptz behält den Zeitpunkt; PostgreSQL zeigt ihn in der Zeitzone der Sitzung statt mit dem Versatz, den jeder Wert hatte.
timetime(p)Dieselben Uhrzeiten.
json (SQL Server 2025)jsonbDieselben JSON-Werte.
uniqueidentifieruuidDieselben Kennungen, in Kleinbuchstaben geschrieben.
binary, varbinary, imagebyteaBytes bleiben Bytes.
geometry, geographybytea mit den eigenen Bytes von SQL ServerSSMS schreibt räumliche Werte in der Serialisierung von SQL Server, die Byte für Byte erhalten bleibt.spatial_as_native
rowversion, timestampbytea, leerSQL Server setzt eine Zeilenversion selbst, und SSMS schreibt keine Werte dafür ins Skript.rowversion_empty
sql_variant, hierarchyid, vectortextPostgreSQL hat keinen entsprechenden Typ; sql_variant behält den Text jedes Werts und hierarchyid seinen Pfad, etwa /1/2/. xml bleibt xml.type_replaced
collations that ignore case (_CI_)exakter VergleichPostgreSQL vergleicht Text exakt, daher unterscheiden Spalten, die in SQL Server die Groß-/Kleinschreibung ignorierten, jetzt Ana und ana.case_insensitive_collation
IDENTITYGENERATED BY DEFAULT AS IDENTITY, weiter nach der höchsten IDDie kopierten IDs laden unverändert, und der Zähler macht nach der höchsten weiter.
CREATE SEQUENCECREATE SEQUENCE mit denselben OptionenSequenzen in PostgreSQL funktionieren genauso. SSMS schreibt nicht ins Skript, wie weit eine Sequenz gekommen ist, daher beginnt sie dort, wo sie angelegt wurde.
computed columnsgenerierte Spalten, STOREDPostgreSQL 13 bis 17 speichern generierte Spalten nur; die Formel ist dieselbe, mit CONCAT so geschrieben, dass NULL wie in SQL Server als leer zählt.virtual_as_stored
computed columns with functions PostgreSQL lackseine normale SpalteEine Formel, die sich nicht für PostgreSQL schreiben lässt, hinterlässt eine normale Spalte und eine Zeile im Bericht; SSMS schreibt keine Werte für berechnete Spalten ins Skript.generated_not_translated
defaults with functions PostgreSQL lacks, and NEXT VALUE FORkein StandardwertEin Standardwert, der sich nicht für PostgreSQL schreiben lässt, wird weggelassen und gemeldet.default_not_translated
CHECK constraintsübersetztDieselben CHECK-Bedingungen, geprüft beim Laden jeder Zeile.
CHECK constraints with functions PostgreSQL lacksnicht angelegtEine CHECK-Bedingung, die sich nicht für PostgreSQL schreiben lässt, wird weggelassen und gemeldet.check_skipped
CHECK constraints added WITH NOCHECK or disablednicht angelegtSQL Server wendet diese CHECK-Bedingungen nicht an, daher können die Zeilen sie verletzen.check_not_enforced
filtered and columnstore indexesnicht angelegtIntoSQL schreibt B-Tree-Indizes auf Spalten; lege die anderen nach dem Laden neu an.index_skipped
foreign keysFremdschlüssel, nach den ZeilenDie Zeilen laden in beliebiger Reihenfolge, und die Schlüssel prüfen sie danach.
foreign keys to tables the dump doesn't createnicht angelegtEin Schlüssel kann nicht auf eine Tabelle verweisen, die es nicht gibt.foreign_key_skipped
tables on a partition schemeeine Tabelle mit den Zeilen aller PartitionenDie Zeilen sind dieselben; partitioniere die Tabelle in PostgreSQL neu, wenn nötig.partitions_dropped
temporal tables (SYSTEM_VERSIONING)zwei Tabellen: die aktuellen Zeilen und die HistorieDie Tabelle und ihre Historientabelle werden als normale Tabellen kopiert; PostgreSQL führt die Historie nicht selbst.system_versioning_dropped
NOT NULL columns with values that become NULLNOT NULL entferntEine Spalte, deren Werte NULL werden mussten, kann NOT NULL nicht behalten, sonst würde das Laden abbrechen.not_null_relaxed
views, functions, procedures, triggers, synonyms, types and partition functionsim Bericht aufgeführtIhr Code ist in T-SQL geschrieben, daher werden sie aufgeführt, damit du sie neu anlegst.not_converted_objects
scripts without CREATE TABLE (data only)Typen aus den Werten gelesenEin Skript nur mit Daten enthält nur Zeilen, daher kommen die Typen aus den Werten.no_schema
expressions in INSERT valuesNULLEin Konverter, der keine Datenbank ausführt, kann sie nicht auswerten.expression_value
types IntoSQL doesn't knowtextText nimmt jeden Wert auf; ändere den Typ nach dem Laden.unknown_type
dates that aren't validNULLEin Wert, der kein Datum ist, wird NULL, und der Bericht zählt ihn.date_out_of_range
NUL characters in textentferntText in PostgreSQL kann kein NUL-Zeichen enthalten. Es wird entfernt, und der Bericht zählt die Werte.nul_removed
text that isn't valid in its encodingdie fehlerhaften Bytes als ErsatzzeichenText in PostgreSQL muss gültiges UTF-8 sein.invalid_utf8_replaced
text decoded twice (ñ)unverändert kopiertDas Skript enthält genau diese Zeichen, daher werden sie kopiert; der Bericht weist auf sie hin.mojibake_suspected

Das Skript in PostgreSQL laden

Das Skript legt die Tabellen an, kopiert die Zeilen und fügt dann Schlüssel, Indizes und Fremdschlüssel hinzu, so lädt es schnell und hält beim ersten Fehler an.

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

Fremdschlüssel werden als NOT VALID hinzugefügt und dann validiert. Verweist eine Zeile auf eine Zeile, die es nicht gibt, nennt dir das Skript den betroffenen Fremdschlüssel, statt auf halbem Weg abzubrechen.

Lege bei einem großen Dump zuerst die Datenbank an und führe das Skript mit psql auf dem Rechner aus, auf dem der Server läuft.

IntoSQL Pro lädt die Datei aus der Desktop-App oder der Kommandozeile direkt in PostgreSQL, ohne ein Skript zu schreiben.

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

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

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

Was nicht konvertiert wird

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

Fragen zu SQL Server zu PostgreSQL

Keine Antwort gefunden? Schreib uns über die Kontaktseite, und ein Mensch antwortet. Kontaktseite

Wird mein Dump hochgeladen?

Nein. Der Konverter läuft in deinem Browser und liest den Dump stückweise von deiner Festplatte, daher verlässt er nie deinen Computer. Die Desktop-App und die Kommandozeile konvertieren ebenfalls auf deinem Computer.

Wie groß darf der Dump sein?

Der Konverter hält nie den ganzen Dump im Speicher: Er liest die Datei zweimal, in Abschnitten, und schreibt das Skript fortlaufend. Dumps von mehreren Gigabyte werden im Browser, in der Desktop-App und mit der Kommandozeile konvertiert.

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

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

Aus welchen SQL Server-Versionen kann das Skript stammen?

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

Bleiben IDENTITY-Werte erhalten?

Ja. IDENTITY-Spalten werden Identity-Spalten, jede Zeile behält ihre ID, und die nächste ID macht nach der höchsten weiter. Sequenzen werden mit denselben Optionen angelegt.

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

bit wird boolean, money numeric(19,4), uniqueidentifier uuid, xml xml und datetimeoffset timestamptz. datetime2 behält sechs Nachkommastellen der Sekunde, die siebte wird abgeschnitten. Spalten, die Groß-/Kleinschreibung ignorierten, vergleichen exakt, und der Bericht nennt sie.

Was ist mit Prozeduren, Triggern und Sichten?

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

Auf welchen PostgreSQL-Versionen lädt das Skript?

PostgreSQL 13 bis 18. Dasselbe Skript lädt auf jeder davon und hält beim ersten Fehler an, falls etwas schiefgeht.