Zum Inhalt springen
IntoSQL-Startseite

PostgreSQL in SQL Server umwandeln

Leg einen einfachen Dump aus pg_dump oder pg_dumpall ab, als .sql oder .sql.gz, und lade ein SQL Server-Skript mit denselben Tabellen, Schlüsseln, Indizes und Daten herunter. Jeder Wert, den SQL Server nicht unverändert aufnehmen kann, und jedes Objekt, das es nicht übernimmt, steht im Bericht.

Deine Datei
sqlshop_2024_postgres.sqlBeispieldatei, 6,2 kB
Deine Datenbank

18 Zeilen konvertiert, 2 Korrekturen, keine abgelehnt

Anzeigen

Tabellen in shop_2024_postgres.sqlPostgreSQL-18.6-Dump · erstellt mit pg_dump · utf8mb4

  • customers8 Zeilen1
    8 Spalten
    idint not null
    namenvarchar(max) not null
    emailnvarchar(450) not null
    countrynvarchar(2) not null
    is_activebit not null
    tagsnvarchar(max) not null
    signed_update
    created_atdatetimeoffset(6) not null
  • orders10 Zeilen1
    10 Spalten
    idint not null
    customer_idint not null
    statusnvarchar(9) not null
    totaldecimal(10,2) not null
    itemssmallint not null
    ordered_atdatetime2(6) not null
    shipped_atdatetime2(6)
    notenvarchar(max)
    detailsnvarchar(max)
    deliverynvarchar(100)

Nicht konvertiert

  • Sicht paid_orders

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

-- Written by IntoSQL from a PostgreSQL dump. Load it with: sqlcmd -b -f 65001 -d <database> -i <file>
SET NOCOUNT ON;
SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
SET ANSI_PADDING ON;
SET ANSI_WARNINGS ON;
SET ARITHABORT ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET NUMERIC_ROUNDABORT OFF;
GO

CREATE TABLE [dbo].[customers] (
    [id] int IDENTITY(1001, 1) NOT NULL,
    [name] nvarchar(max) COLLATE Latin1_General_100_BIN2 NOT NULL,
    [email] nvarchar(450) COLLATE Latin1_General_100_BIN2 NOT NULL,
    [country] nvarchar(2) COLLATE Latin1_General_100_BIN2 DEFAULT N'US' NOT NULL,
    [is_active] bit DEFAULT 1 NOT NULL,
    [tags] nvarchar(max) COLLATE Latin1_General_100_BIN2 NOT NULL,
    [signed_up] date NULL,
    [created_at] datetimeoffset(6) DEFAULT SYSDATETIMEOFFSET() NOT NULL,
    CONSTRAINT [PK_customers] PRIMARY KEY ([id])
);
GO

CREATE TABLE [dbo].[orders] (
    [id] int IDENTITY(5001, 1) NOT NULL,
    [customer_id] int NOT NULL,
    [status] nvarchar(9) COLLATE Latin1_General_100_BIN2 DEFAULT N'pending' NOT NULL,
    [total] decimal(10,2) NOT NULL,
    [items] smallint DEFAULT 1 NOT NULL,
    [ordered_at] datetime2(6) NOT NULL,
    [shipped_at] datetime2(6) NULL,
    [note] nvarchar(max) COLLATE Latin1_General_100_BIN2 NULL,
    [details] nvarchar(max) COLLATE Latin1_General_100_BIN2 NULL,
    [delivery] nvarchar(100) COLLATE Latin1_General_100_BIN2 NULL,
    CONSTRAINT [CK_orders_status] CHECK ([status] IN (N'pending', N'paid', N'shipped', N'cancelled')),
    CONSTRAINT [orders_total_check] CHECK ([total] >= (0)),
    CONSTRAINT [PK_orders] PRIMARY KEY ([id])
);
GO

SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [tags], [signed_up], [created_at]) VALUES
(1,N'Ana Martínez',N'ana@example.com',N'MX',1,N'["vip"]','2023-01-15','2023-01-15 10:24:00+00:00'),
(2,N'Zoë Müller',N'zoe@example.de',N'DE',1,N'[]','2023-02-03','2023-02-03 08:11:42+00:00'),
(3,N'José Peña',N'jose@example.es',N'ES',0,N'["wholesale","late payer"]','2023-03-21','2023-03-21 19:05:17+00:00'),
(4,N'李雷',N'lilei@example.cn',N'CN',1,N'[]','2023-05-09','2023-05-09 02:40:00+00:00'),
(5,N'Noah O''Brien',N'noah@example.ie',N'IE',1,N'[]',NULL,'2023-06-30 14:00:00+00:00'),
(6,N'Amélie Laurent',N'amelie@example.fr',N'FR',1,N'["vip"]','2024-01-02','2024-01-02 09:30:00+00:00'),
(7,N'Ravi Patel',N'ravi@example.in',N'IN',0,N'[]','2024-02-29','2024-02-29 23:59:59+00:00'),
(8,N'Sofia Rossi 🌻',N'sofia@example.it',N'IT',1,N'[]','2024-04-12','2024-04-12 12:12:12+00:00');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [details], [delivery]) VALUES
(1,1,N'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,N'{"gift": false}',N'1 day 06:30:00'),
(2,2,N'paid',54.00,1,'2024-03-02 11:15:00',NULL,N'Gift wrap 🎁',N'{"gift": true, "wrap": "red"}',NULL),
(3,1,N'cancelled',12.50,1,'2024-03-03 09:45:00',NULL,N'Customer changed their mind',NULL,NULL),
(4,4,N'shipped',980.00,12,'2024-03-05 02:10:00','2024-03-07 08:00:00',N'请小心轻放',N'{"fragile": true}',N'2 days 05:50:00'),
(5,5,N'pending',45.75,2,'2024-03-08 17:20:00',NULL,N'Leave at the door; ring twice',NULL,NULL),
(6,6,N'shipped',310.40,5,'2024-03-10 13:00:00','2024-03-11 09:00:00',N'Fragile: "glass"',N'{"fragile": true}',N'20:00:00'),
(7,8,N'paid',76.20,2,'2024-03-11 18:45:00',NULL,NULL,NULL,NULL),
(8,2,N'shipped',19.99,1,'2024-03-12 08:00:00',NULL,N'Shipped date set to infinity by an old import',NULL,NULL),
(9,3,N'shipped',64.00,2,'2024-03-14 15:30:00','2024-03-15 10:00:00',N'Two parcels',N'{"parcels": [1, 2]}',N'18:30:00'),
(10,7,N'paid',1499.00,1,'2024-03-15 21:05:00',NULL,N'C:\Users\ravi\invoice.pdf',NULL,NULL);
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO

-- Indexes, foreign keys, counters and triggers, after the rows.
CREATE UNIQUE INDEX [customers_email_key] ON [dbo].[customers] ([email]);
CREATE INDEX [idx_orders_customer] ON [dbo].[orders] ([customer_id]);
CREATE INDEX [idx_orders_status_date] ON [dbo].[orders] ([status], [ordered_at]);
ALTER TABLE [dbo].[orders] WITH NOCHECK ADD CONSTRAINT [orders_customer_id_fkey] FOREIGN KEY ([customer_id]) REFERENCES [dbo].[customers] ([id]);
BEGIN TRY ALTER TABLE [dbo].[orders] WITH CHECK CHECK CONSTRAINT [orders_customer_id_fkey]; END TRY BEGIN CATCH PRINT N'Foreign key ' + N'[orders_customer_id_fkey]' + N' has rows without a parent: it stays unchecked, and new rows are checked.'; END CATCH;
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[customers]); IF @next IS NOT NULL BEGIN IF @next < 1000 SET @next = 1000; DBCC CHECKIDENT (N'[dbo].[customers]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = N'People who bought at least once', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'customers';
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[orders]); IF @next IS NOT NULL BEGIN IF @next < 5000 SET @next = 5000; DBCC CHECKIDENT (N'[dbo].[orders]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
GO

Korrekturen

  1. "tags" von customers ist text[], was SQL Server nicht hat, daher ist sie nvarchar(max) mit denselben Werten.
  2. "delivery" von orders ist interval, was SQL Server nicht hat, daher ist sie nvarchar(100) mit denselben Werten.

Zu prüfen

  • 1 Sicht, Trigger, Routine oder Ereignis wird nicht konvertiert; der Bericht listet sie einzeln auf. Lege sie in SQL Server von Hand neu an.
  • Der Standardwert von "tags" in customers lässt sich nicht für SQL Server schreiben (a value its type can't hold), daher hat die Spalte keinen Standardwert. Füge den Standardwert von Hand hinzu, wenn neue Zeilen ihn brauchen.
  • Der Index idx_orders_details auf orders nutzt einen Ausdruck, der sich nicht für SQL Server schreiben lässt (an index on an expression), daher wird er nicht angelegt. Lege den Index von Hand an, wenn Abfragen ihn brauchen.
  • 1 Wert in "shipped_at" von orders ist ein Datum, das SQL Server nicht speichern kann, etwa infinity, daher ist er NULL. SQL Server speichert die Jahre 1 bis 9999, ohne Unendlich; ersetze diese Datumsangaben in der Quelle, wenn sie wichtig sind.

Deine Datei wird auf diesem Computer umgewandelt und nie hochgeladen.

Weitere Beispiele:

Was sich von PostgreSQL zu SQL Server ändert

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

  • boolean

    bit

    bit speichert true als 1 und false als 0.

  • varchar(n), char(n), text

    nvarchar(n); text als nvarchar(max) oder nvarchar(450), wenn ein Schlüssel ihn nutzt und jeder Wert passt

    nvarchar fasst jedes Zeichen. SQL Server kann nvarchar(max) nicht indizieren, daher bekommt Text in einem Schlüssel eine Größe, die in einen Schlüssel passt.

  • text comparison

    exakt (Latin1_General_100_BIN2); citext ohne Groß-/Kleinschreibung (Latin1_General_100_CI_AS_SC)

    Die übliche Kollation von SQL Server ignoriert die Groß-/Kleinschreibung, text in PostgreSQL nicht, daher gibt jede Spalte an, wie sie vergleicht, und eindeutige Schlüssel halten dieselben Zeilen auseinander.

  • numeric(p,s) past 38 digits; numeric without a precision

    nvarchar; decimal(p,s) passend zu den Werten, wenn sie in 38 Stellen passen

    decimal in SQL Server fasst 38 Stellen. Ein numeric ohne Genauigkeit bekommt das schmalste decimal, in das seine Werte passen; breitere Zahlen bleiben Text, damit jede Stelle exakt bleibt.

    Berichtszeile: decimal_as_text

  • money

    decimal(19,2)

    money in SQL Server ist kleiner als in PostgreSQL und hat vier Nachkommastellen; decimal(19,2) fasst jeden Betrag, ohne das Währungssymbol, das die Locale des Servers hinzugefügt hat.

    Berichtszeile: type_replaced

  • interval

    nvarchar(100) mit dem Text von PostgreSQL

    SQL Server hat keinen interval-Typ; der Text behält jeden Teil.

    Berichtszeile: type_replaced

  • arrays (integer[], text[]...)

    nvarchar(max) mit einem JSON-Array

    SQL Server hat keine Arrays. Ein JSON-Array behält jedes Element und NULL, und OPENJSON liest es.

    Berichtszeile: type_replaced

  • ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types

    nvarchar(max) mit dem Text von PostgreSQL

    SQL Server hat keinen entsprechenden Typ, daher behält jeder Wert den Text, den PostgreSQL geschrieben hat.

    Berichtszeile: type_replaced

  • json, jsonb

    nvarchar(max)

    Die JSON-Funktionen von SQL Server lesen JSON aus Text.

  • timestamp

    datetime2

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

  • timestamp with time zone

    datetimeoffset in UTC

    datetimeoffset behält den Zeitpunkt; jeder Wert wird in UTC geschrieben: derselbe Zeitpunkt, welchen Versatz der Dump auch geschrieben hat.

  • time with 24:00:00 in it

    nvarchar(17)

    time in SQL Server endet bei 23:59:59.9999999, daher behält eine Spalte mit 24:00:00 ihren Text.

    Berichtszeile: time_as_interval

  • infinity, -infinity and BC dates

    NULL

    SQL Server speichert die Jahre 1 bis 9999, ohne Unendlich. Diese Werte werden NULL, und der Bericht zählt sie.

    Berichtszeile: date_out_of_range

  • NaN and Infinity in numeric, real and double precision

    NULL

    Zahlen in SQL Server kennen weder NaN noch Infinity, daher werden diese Werte NULL, und der Bericht zählt sie.

    Berichtszeile: invalid_value_null

  • 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

  • enum types

    nvarchar mit einem CHECK seiner Labels

    Text mit einer CHECK-Bedingung behält dieselben Werte.

  • enum columns holding values outside their labels

    nvarchar ohne CHECK

    Werte, die nicht unter den Labels stehen, würden die CHECK-Bedingung verletzen, daher wird sie nicht angelegt.

    Berichtszeile: enum_check_skipped

  • uuid, inet, cidr, macaddr

    uniqueidentifier; Adressen als nvarchar

    uniqueidentifier ist die UUID von SQL Server; Adressen bleiben Text.

  • bytea

    varbinary(max)

    Bytes bleiben Bytes.

  • bit(n), bit varying

    bit für ein Bit; bigint bis 63 Bit; darüber Ziffern als Text

    Ein einzelnes Bit ist ein Ja oder Nein; längere Bitstrings werden als die Zahl gespeichert, die ihre Bits ergeben.

  • oid, xid, cid

    bigint mit einem CHECK gegen negative Werte

    bigint fasst jeden Wert.

  • serial, identity

    IDENTITY, weiter nach der höchsten ID

    Die kopierten IDs laden mit IDENTITY_INSERT, und der Zähler macht nach der höchsten weiter oder beim nächsten Wert der Sequenz, je nachdem, was höher ist.

  • a second serial or identity column in a table

    eine normale Ganzzahl

    SQL Server zählt eine IDENTITY-Spalte pro Tabelle; jede andere behält ihre Werte ohne Zähler.

    Berichtszeile: counter_dropped

  • sequences not owned by a column

    CREATE SEQUENCE ... AS bigint, mit ihrem nächsten Wert

    SQL Server hat Sequenzen mit denselben Optionen; jede macht dort weiter, wo der Dump aufgehört hat.

  • generated columns

    berechnete Spalten, PERSISTED, wenn die Quelle sie speichert

    SQL Server berechnet sie auf dieselben zwei Arten.

  • generated columns with functions SQL Server lacks

    eine normale Spalte mit den Werten

    Eine Formel, die sich nicht für SQL Server schreiben lässt, hinterlässt eine normale Spalte mit den Werten des Dumps und eine Zeile im Bericht.

    Berichtszeile: generated_not_translated

  • defaults with functions SQL Server lacks, and defaults from a sequence

    kein Standardwert

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

    Berichtszeile: default_not_translated

  • CHECK constraints

    übersetzt, inline in CREATE TABLE

    Inline-CHECK-Bedingungen werden beim Laden jeder Zeile geprüft.

  • CHECK constraints with functions SQL Server lacks

    nicht angelegt

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

    Berichtszeile: check_skipped

  • CHECK ... NOT VALID

    nicht angelegt

    PostgreSQL hat die vorher vorhandenen Zeilen nie geprüft, daher können sie die CHECK-Bedingung verletzen.

    Berichtszeile: check_not_valid

  • gin, gist, brin and hash indexes, partial and expression indexes, and indexes on text that doesn't fit a key

    nicht angelegt

    SQL Server indiziert Spalten, keine Ausdrücke und kein nvarchar(max).

    Berichtszeile: index_skipped

  • foreign keys

    nach den Daten, WITH NOCHECK, dann geprüft, mit einer Warnung bei verwaisten Zeilen

    Der Schlüssel wird nach den Zeilen angelegt und zuletzt geprüft; Zeilen ohne Elternzeile lassen ihn mit einer Warnung ungeprüft, statt das Laden abzubrechen.

  • ON DELETE or ON UPDATE that cascades in a cycle or along a second path

    NO ACTION

    SQL Server lehnt Kaskaden ab, die eine Tabelle zweimal erreichen könnten; PostgreSQL erlaubt sie.

    Berichtszeile: foreign_key_action_dropped

  • 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

  • partitioned tables

    eine Tabelle mit den Zeilen aller Partitionen

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

    Berichtszeile: partitions_dropped

  • views, functions, procedures, triggers, rules, policies, extensions and types

    im Bericht aufgeführt

    Ihr Code ist in der Sprache von PostgreSQL geschrieben, daher werden sie aufgeführt, damit du sie neu anlegst.

    Berichtszeile: not_converted_objects

  • dumps without CREATE TABLE (--data-only)

    Typen aus den Werten gelesen

    Ein Dump 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

    nvarchar(max)

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

    Berichtszeile: unknown_type

  • text that isn't valid in its encoding

    die fehlerhaften Bytes als Ersatzzeichen

    nvarchar fasst Unicode-Text.

    Berichtszeile: invalid_utf8_replaced

  • text decoded twice (ñ)

    unverändert kopiert

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

    Berichtszeile: mojibake_suspected

In PostgreSQLIn SQL ServerBerichtszeile
booleanbitbit speichert true als 1 und false als 0.
varchar(n), char(n), textnvarchar(n); text als nvarchar(max) oder nvarchar(450), wenn ein Schlüssel ihn nutzt und jeder Wert passtnvarchar fasst jedes Zeichen. SQL Server kann nvarchar(max) nicht indizieren, daher bekommt Text in einem Schlüssel eine Größe, die in einen Schlüssel passt.
text comparisonexakt (Latin1_General_100_BIN2); citext ohne Groß-/Kleinschreibung (Latin1_General_100_CI_AS_SC)Die übliche Kollation von SQL Server ignoriert die Groß-/Kleinschreibung, text in PostgreSQL nicht, daher gibt jede Spalte an, wie sie vergleicht, und eindeutige Schlüssel halten dieselben Zeilen auseinander.
numeric(p,s) past 38 digits; numeric without a precisionnvarchar; decimal(p,s) passend zu den Werten, wenn sie in 38 Stellen passendecimal in SQL Server fasst 38 Stellen. Ein numeric ohne Genauigkeit bekommt das schmalste decimal, in das seine Werte passen; breitere Zahlen bleiben Text, damit jede Stelle exakt bleibt.decimal_as_text
moneydecimal(19,2)money in SQL Server ist kleiner als in PostgreSQL und hat vier Nachkommastellen; decimal(19,2) fasst jeden Betrag, ohne das Währungssymbol, das die Locale des Servers hinzugefügt hat.type_replaced
intervalnvarchar(100) mit dem Text von PostgreSQLSQL Server hat keinen interval-Typ; der Text behält jeden Teil.type_replaced
arrays (integer[], text[]...)nvarchar(max) mit einem JSON-ArraySQL Server hat keine Arrays. Ein JSON-Array behält jedes Element und NULL, und OPENJSON liest es.type_replaced
ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension typesnvarchar(max) mit dem Text von PostgreSQLSQL Server hat keinen entsprechenden Typ, daher behält jeder Wert den Text, den PostgreSQL geschrieben hat.type_replaced
json, jsonbnvarchar(max)Die JSON-Funktionen von SQL Server lesen JSON aus Text.
timestampdatetime2Ein timestamp without time zone ist eine Uhrzeitangabe ohne Zeitzone, wie datetime2.
timestamp with time zonedatetimeoffset in UTCdatetimeoffset behält den Zeitpunkt; jeder Wert wird in UTC geschrieben: derselbe Zeitpunkt, welchen Versatz der Dump auch geschrieben hat.
time with 24:00:00 in itnvarchar(17)time in SQL Server endet bei 23:59:59.9999999, daher behält eine Spalte mit 24:00:00 ihren Text.time_as_interval
infinity, -infinity and BC datesNULLSQL Server speichert die Jahre 1 bis 9999, ohne Unendlich. Diese Werte werden NULL, und der Bericht zählt sie.date_out_of_range
NaN and Infinity in numeric, real and double precisionNULLZahlen in SQL Server kennen weder NaN noch Infinity, daher werden diese Werte NULL, und der Bericht zählt sie.invalid_value_null
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
enum typesnvarchar mit einem CHECK seiner LabelsText mit einer CHECK-Bedingung behält dieselben Werte.
enum columns holding values outside their labelsnvarchar ohne CHECKWerte, die nicht unter den Labels stehen, würden die CHECK-Bedingung verletzen, daher wird sie nicht angelegt.enum_check_skipped
uuid, inet, cidr, macaddruniqueidentifier; Adressen als nvarcharuniqueidentifier ist die UUID von SQL Server; Adressen bleiben Text.
byteavarbinary(max)Bytes bleiben Bytes.
bit(n), bit varyingbit für ein Bit; bigint bis 63 Bit; darüber Ziffern als TextEin einzelnes Bit ist ein Ja oder Nein; längere Bitstrings werden als die Zahl gespeichert, die ihre Bits ergeben.
oid, xid, cidbigint mit einem CHECK gegen negative Wertebigint fasst jeden Wert.
serial, identityIDENTITY, weiter nach der höchsten IDDie kopierten IDs laden mit IDENTITY_INSERT, und der Zähler macht nach der höchsten weiter oder beim nächsten Wert der Sequenz, je nachdem, was höher ist.
a second serial or identity column in a tableeine normale GanzzahlSQL Server zählt eine IDENTITY-Spalte pro Tabelle; jede andere behält ihre Werte ohne Zähler.counter_dropped
sequences not owned by a columnCREATE SEQUENCE ... AS bigint, mit ihrem nächsten WertSQL Server hat Sequenzen mit denselben Optionen; jede macht dort weiter, wo der Dump aufgehört hat.
generated columnsberechnete Spalten, PERSISTED, wenn die Quelle sie speichertSQL Server berechnet sie auf dieselben zwei Arten.
generated columns with functions SQL Server lackseine normale Spalte mit den WertenEine Formel, die sich nicht für SQL Server schreiben lässt, hinterlässt eine normale Spalte mit den Werten des Dumps und eine Zeile im Bericht.generated_not_translated
defaults with functions SQL Server lacks, and defaults from a sequencekein StandardwertEin Standardwert, der sich nicht für SQL Server schreiben lässt, wird weggelassen und gemeldet.default_not_translated
CHECK constraintsübersetzt, inline in CREATE TABLEInline-CHECK-Bedingungen werden beim Laden jeder Zeile geprüft.
CHECK constraints with functions SQL Server lacksnicht angelegtEine CHECK-Bedingung, die sich nicht für SQL Server schreiben lässt, wird weggelassen und gemeldet.check_skipped
CHECK ... NOT VALIDnicht angelegtPostgreSQL hat die vorher vorhandenen Zeilen nie geprüft, daher können sie die CHECK-Bedingung verletzen.check_not_valid
gin, gist, brin and hash indexes, partial and expression indexes, and indexes on text that doesn't fit a keynicht angelegtSQL Server indiziert Spalten, keine Ausdrücke und kein nvarchar(max).index_skipped
foreign keysnach den Daten, WITH NOCHECK, dann geprüft, mit einer Warnung bei verwaisten ZeilenDer Schlüssel wird nach den Zeilen angelegt und zuletzt geprüft; Zeilen ohne Elternzeile lassen ihn mit einer Warnung ungeprüft, statt das Laden abzubrechen.
ON DELETE or ON UPDATE that cascades in a cycle or along a second pathNO ACTIONSQL Server lehnt Kaskaden ab, die eine Tabelle zweimal erreichen könnten; PostgreSQL erlaubt sie.foreign_key_action_dropped
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
partitioned tableseine Tabelle mit den Zeilen aller PartitionenDie Zeilen sind dieselben; partitioniere die Tabelle in SQL Server neu, wenn nötig.partitions_dropped
views, functions, procedures, triggers, rules, policies, extensions and typesim Bericht aufgeführtIhr Code ist in der Sprache von PostgreSQL geschrieben, daher werden sie aufgeführt, damit du sie neu anlegst.not_converted_objects
dumps without CREATE TABLE (--data-only)Typen aus den Werten gelesenEin Dump 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 knownvarchar(max)Text nimmt jeden Wert auf; ändere den Typ nach dem Laden.unknown_type
text that isn't valid in its encodingdie fehlerhaften Bytes als Ersatzzeichennvarchar fasst Unicode-Text.invalid_utf8_replaced
text decoded twice (ñ)unverändert kopiertDer Dump enthält genau diese Zeichen, daher werden sie kopiert; der Bericht weist auf sie hin.mojibake_suspected

Das Skript in SQL Server 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.

sqlcmd -b -f 65001 -S localhost -d mydb -i postgresql.sql_server.sql

Fremdschlüssel werden mit WITH NOCHECK hinzugefügt und dann geprüft. Verweist eine Zeile auf eine nicht vorhandene Zeile, nennt das Skript den Fremdschlüssel und lässt ihn ungeprüft, statt auf halbem Weg abzubrechen.

Führe bei einem großen Dump sqlcmd auf dem Rechner des Servers aus. Jeder Stapel von bis zu 1000 Zeilen wird einzeln festgeschrieben, so bleibt das Transaktionsprotokoll klein.

Den PostgreSQL-Dump für das beste Ergebnis erstellen

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

  • --format=plain, die Standardeinstellung von pg_dump, schreibt SQL. Ein custom- oder directory-Archiv (-Fc, -Fd) wird mit pg_restore -f dump.sql zu SQL, ohne Datenbankserver.
  • --no-owner --no-privileges lassen Rollen und Rechte weg, die der Konverter ohnehin überspringt, daher wird der Dump kleiner.
  • pg_dumpall schreibt jede Datenbank in eine Datei; die Tabellen jeder Datenbank werden nach ihr benannt, damit nichts kollidiert.

Was nicht konvertiert wird

Sichten, materialisierte Sichten, Funktionen, Prozeduren, Trigger, Regeln, Zeilensicherheitsrichtlinien, Erweiterungen und Typen sind in der eigenen Sprache von PostgreSQL geschrieben. Sie stehen mit Namen im Bericht und werden nie stillschweigend weggelassen, damit du sie für SQL Server neu schreiben kannst.

Fragen zu PostgreSQL zu SQL Server

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 pg_dump -Fc-Archive?

Nicht direkt: Ein custom-Archiv ist ein Binärformat. pg_restore -f dump.sql dump.backup wandelt es in das einfache SQL um, das der Konverter liest, ohne Verbindung zu einem Server. Der Konverter sagt das, wenn er ein Archiv bekommt.

Aus welchen PostgreSQL-Versionen kann der Dump stammen?

Dumps aus pg_dump und pg_dumpall ab PostgreSQL 10, mit COPY- oder INSERT-Zeilen. Jeder Test-Dump stammt aus PostgreSQL 13 und 18 und wird Zelle für Zelle mit seiner Quelle verglichen.

Bleiben serial- und Identity-Werte erhalten?

Ja. Die serial- oder Identity-Spalte jeder Tabelle wird eine IDENTITY-Spalte, jede Zeile behält ihre ID, und die nächste ID macht nach der höchsten weiter. SQL Server zählt eine Spalte pro Tabelle, daher behält jede andere ihre Werte ohne Zähler.

Was passiert mit Arrays, enums und anderen PostgreSQL-Typen?

Arrays werden JSON-Arrays, Booleans bit, uuid uniqueidentifier und Zeitstempel mit Zeitzone datetimeoffset. Text wird exakt verglichen, wie in PostgreSQL, und citext ohne Groß-/Kleinschreibung. Ranges, geometrische Typen und zusammengesetzte Typen behalten den Text von PostgreSQL.

Was ist mit Funktionen, Triggern und Sichten?

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

Auf welchen SQL Server-Versionen lädt das Skript?

SQL Server 2017 bis 2025. Dasselbe Skript lädt auf jeder Version und hält beim ersten Fehler an, falls etwas schiefgeht.