Converti PostgreSQL in SQL Server
Trascina un dump plain di pg_dump o pg_dumpall, come .sql o .sql.gz, e scarica uno script per SQL Server con le stesse tabelle, chiavi, indici e dati. Ogni valore che SQL Server non può contenere così com'è, e ogni oggetto che non supporta, è elencato nel report.
18 righe convertite, 2 correzioni, nessuna rifiutata
Tabelle in shop_2024_postgres.sqlDump PostgreSQL 18.6 · scritto da pg_dump · utf8mb4
customers8 righe1
8 colonne id int not null name nvarchar(max) not null email nvarchar(450) not null country nvarchar(2) not null is_active bit not null tags nvarchar(max) not null signed_up date created_at datetimeoffset(6) not null orders10 righe1
10 colonne id int not null customer_id int not null status nvarchar(9) not null total decimal(10,2) not null items smallint not null ordered_at datetime2(6) not null shipped_at datetime2(6) note nvarchar(max) details nvarchar(max) delivery nvarchar(100)
Non convertiti
- Vista paid_orders
Ogni database li scrive nel proprio linguaggio. Riscrivili per SQL Server.
-- 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
Correzioni
- "tags" di customers è text[], che SQL Server non ha, quindi è nvarchar(max) con gli stessi valori.
- "delivery" di orders è interval, che SQL Server non ha, quindi è nvarchar(100) con gli stessi valori.
Da controllare
- 1 vista, trigger, routine o evento non è convertito; il report li elenca uno per uno. Ricreali a mano in SQL Server.
- Il valore predefinito di "tags" in customers non si può scrivere per SQL Server (a value its type can't hold), quindi la colonna non ha un valore predefinito. Aggiungi a mano il valore predefinito se le nuove righe ne hanno bisogno.
- L'indice idx_orders_details su orders usa un'espressione che non si può scrivere per SQL Server (an index on an expression), quindi non viene creato. Crea l'indice a mano se le query ne hanno bisogno.
- 1 valore in "shipped_at" di orders è una data che SQL Server non può salvare, come infinity, quindi è NULL. SQL Server salva gli anni dall'1 al 9999 senza infinito; sostituisci quelle date nella sorgente se contano.
Il tuo file viene convertito su questo computer e non viene mai caricato.
Altri esempi:
Cosa cambia da PostgreSQL a SQL Server
Ogni riga è una regola che il convertitore applica, con la riga del report che scrive quando la regola cambia qualcosa nei tuoi dati.
boolean
bit
bit contiene true come 1 e false come 0.
varchar(n), char(n), text
nvarchar(n); text come nvarchar(max), o nvarchar(450) quando una chiave lo usa e ogni valore ci sta
nvarchar contiene ogni carattere. SQL Server non può indicizzare nvarchar(max), quindi il testo in una chiave ha una dimensione adatta a una chiave.
text comparison
esatto (Latin1_General_100_BIN2); citext ignorando le maiuscole (Latin1_General_100_CI_AS_SC)
La collation abituale di SQL Server ignora le maiuscole e il text di PostgreSQL no, quindi ogni colonna indica come confronta e le chiavi univoche separano le stesse righe.
numeric(p,s) past 38 digits; numeric without a precision
nvarchar; decimal(p,s) adattato ai valori quando stanno in 38 cifre
Il decimal di SQL Server contiene 38 cifre. Un numeric senza precisione riceve il decimal più stretto in cui stanno i suoi valori; i numeri più ampi restano testo così ogni cifra resta esatta.
Riga del report: decimal_as_text
money
decimal(19,2)
Il money di SQL Server è più piccolo di quello di PostgreSQL e ha quattro decimali; decimal(19,2) contiene ogni importo, senza il simbolo di valuta aggiunto dal locale del server.
Riga del report: type_replaced
interval
nvarchar(100) con il testo di PostgreSQL
SQL Server non ha un tipo interval; il testo mantiene ogni parte.
Riga del report: type_replaced
arrays (integer[], text[]...)
nvarchar(max) con un array JSON
SQL Server non ha array. Un array JSON mantiene ogni elemento e i NULL, e OPENJSON lo legge.
Riga del report: type_replaced
ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types
nvarchar(max) con il testo di PostgreSQL
SQL Server non ha un tipo equivalente, quindi ogni valore mantiene il testo scritto da PostgreSQL.
Riga del report: type_replaced
json, jsonb
nvarchar(max)
Le funzioni JSON di SQL Server leggono il JSON dal testo.
timestamp
datetime2
Un timestamp senza fuso orario è l'ora letta su un orologio, come datetime2.
timestamp with time zone
datetimeoffset in UTC
datetimeoffset mantiene l'istante; ogni valore è scritto in UTC, lo stesso istante qualunque offset abbia scritto il dump.
time with 24:00:00 in it
nvarchar(17)
Il time di SQL Server finisce a 23:59:59.9999999, quindi una colonna che contiene 24:00:00 mantiene il suo testo.
Riga del report: time_as_interval
infinity, -infinity and BC dates
NULL
SQL Server salva gli anni dall'1 al 9999 senza infinito. Quei valori diventano NULL e il report li conta.
Riga del report: date_out_of_range
NaN and Infinity in numeric, real and double precision
NULL
I numeri di SQL Server non hanno NaN né Infinity, quindi quei valori diventano NULL e il report li conta.
Riga del report: invalid_value_null
NOT NULL columns with values that become NULL
NOT NULL rimosso
Una colonna i cui valori sono dovuti diventare NULL non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe.
Riga del report: not_null_relaxed
enum types
nvarchar con un CHECK delle sue etichette
Il testo con un vincolo CHECK mantiene gli stessi valori.
enum columns holding values outside their labels
nvarchar senza CHECK
I valori che le etichette non nominano violerebbero il vincolo CHECK, quindi il vincolo non viene creato.
Riga del report: enum_check_skipped
uuid, inet, cidr, macaddr
uniqueidentifier; indirizzi come nvarchar
uniqueidentifier è l'UUID di SQL Server; gli indirizzi restano come testo.
bytea
varbinary(max)
I byte restano byte.
bit(n), bit varying
bit per un bit; bigint fino a 63 bit; cifre come testo oltre
Un singolo bit è un sì o un no; le stringhe di bit più lunghe sono salvate come il numero formato dai loro bit.
oid, xid, cid
bigint con un CHECK che non sia negativo
bigint contiene ogni valore.
serial, identity
IDENTITY, che riparte dopo l'id più alto
Gli id copiati si caricano con IDENTITY_INSERT, e il contatore riparte dopo il più alto o dal valore successivo della sequenza, quello maggiore.
a second serial or identity column in a table
un intero semplice
SQL Server conta una colonna IDENTITY per tabella; ogni altra mantiene i suoi valori senza contatore.
Riga del report: counter_dropped
sequences not owned by a column
CREATE SEQUENCE ... AS bigint, con il suo valore successivo
SQL Server ha sequenze con le stesse opzioni; ognuna riparte da dove l'ha lasciata il dump.
generated columns
colonne calcolate, PERSISTED quando la sorgente le salva
SQL Server le calcola negli stessi due modi.
generated columns with functions SQL Server lacks
una colonna semplice con i valori
Una formula che non si può scrivere per SQL Server lascia una colonna semplice con i valori del dump e una riga nel report.
Riga del report: generated_not_translated
defaults with functions SQL Server lacks, and defaults from a sequence
nessun valore predefinito
Un valore predefinito che non si può scrivere per SQL Server viene omesso e segnalato.
Riga del report: default_not_translated
CHECK constraints
tradotti, dentro CREATE TABLE
I CHECK nella tabella si verificano mentre ogni riga si carica.
CHECK constraints with functions SQL Server lacks
non creato
Un vincolo CHECK che non si può scrivere per SQL Server viene omesso e segnalato.
Riga del report: check_skipped
CHECK ... NOT VALID
non creato
PostgreSQL non ha mai verificato le righe che c'erano prima, quindi potrebbero violarlo.
Riga del report: check_not_valid
gin, gist, brin and hash indexes, partial and expression indexes, and indexes on text that doesn't fit a key
non creato
SQL Server indicizza colonne, non espressioni, e non nvarchar(max).
Riga del report: index_skipped
foreign keys
dopo i dati WITH NOCHECK, poi controllata con un avviso sulle righe orfane
La chiave viene creata dopo le righe e controllata alla fine; righe senza padre la lasciano non controllata con un avviso invece di fermare il caricamento.
ON DELETE or ON UPDATE that cascades in a cycle or along a second path
NO ACTION
SQL Server rifiuta le cascate che potrebbero raggiungere una tabella due volte; PostgreSQL le permette.
Riga del report: foreign_key_action_dropped
foreign keys to tables the dump doesn't create
non creato
Una chiave non può riferirsi a una tabella che non c'è.
Riga del report: foreign_key_skipped
partitioned tables
una tabella con le righe di ogni partizione
Le righe sono le stesse; partiziona di nuovo la tabella in SQL Server se serve.
Riga del report: partitions_dropped
views, functions, procedures, triggers, rules, policies, extensions and types
elencati nel report
Il loro codice è scritto nel linguaggio di PostgreSQL, quindi vengono elencati perché tu li ricrei.
Riga del report: not_converted_objects
dumps without CREATE TABLE (--data-only)
tipi ricavati dai valori
Un dump di soli dati contiene solo righe, quindi i tipi vengono ricavati dai valori.
Riga del report: no_schema
expressions in INSERT values
NULL
Un convertitore che non esegue un database non può valutarle.
Riga del report: expression_value
types IntoSQL doesn't know
nvarchar(max)
Il testo contiene qualsiasi valore; cambia il tipo dopo il caricamento.
Riga del report: unknown_type
text that isn't valid in its encoding
i byte errati come carattere di sostituzione
nvarchar contiene testo Unicode.
Riga del report: invalid_utf8_replaced
text decoded twice (ñ)
copiato così com'è
Il dump contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala.
Riga del report: mojibake_suspected
| In PostgreSQL | In SQL Server | Riga del report |
|---|---|---|
| boolean | bitbit contiene true come 1 e false come 0. | |
| varchar(n), char(n), text | nvarchar(n); text come nvarchar(max), o nvarchar(450) quando una chiave lo usa e ogni valore ci stanvarchar contiene ogni carattere. SQL Server non può indicizzare nvarchar(max), quindi il testo in una chiave ha una dimensione adatta a una chiave. | |
| text comparison | esatto (Latin1_General_100_BIN2); citext ignorando le maiuscole (Latin1_General_100_CI_AS_SC)La collation abituale di SQL Server ignora le maiuscole e il text di PostgreSQL no, quindi ogni colonna indica come confronta e le chiavi univoche separano le stesse righe. | |
| numeric(p,s) past 38 digits; numeric without a precision | nvarchar; decimal(p,s) adattato ai valori quando stanno in 38 cifreIl decimal di SQL Server contiene 38 cifre. Un numeric senza precisione riceve il decimal più stretto in cui stanno i suoi valori; i numeri più ampi restano testo così ogni cifra resta esatta. | decimal_as_text |
| money | decimal(19,2)Il money di SQL Server è più piccolo di quello di PostgreSQL e ha quattro decimali; decimal(19,2) contiene ogni importo, senza il simbolo di valuta aggiunto dal locale del server. | type_replaced |
| interval | nvarchar(100) con il testo di PostgreSQLSQL Server non ha un tipo interval; il testo mantiene ogni parte. | type_replaced |
| arrays (integer[], text[]...) | nvarchar(max) con un array JSONSQL Server non ha array. Un array JSON mantiene ogni elemento e i NULL, e OPENJSON lo legge. | type_replaced |
| ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types | nvarchar(max) con il testo di PostgreSQLSQL Server non ha un tipo equivalente, quindi ogni valore mantiene il testo scritto da PostgreSQL. | type_replaced |
| json, jsonb | nvarchar(max)Le funzioni JSON di SQL Server leggono il JSON dal testo. | |
| timestamp | datetime2Un timestamp senza fuso orario è l'ora letta su un orologio, come datetime2. | |
| timestamp with time zone | datetimeoffset in UTCdatetimeoffset mantiene l'istante; ogni valore è scritto in UTC, lo stesso istante qualunque offset abbia scritto il dump. | |
| time with 24:00:00 in it | nvarchar(17)Il time di SQL Server finisce a 23:59:59.9999999, quindi una colonna che contiene 24:00:00 mantiene il suo testo. | time_as_interval |
| infinity, -infinity and BC dates | NULLSQL Server salva gli anni dall'1 al 9999 senza infinito. Quei valori diventano NULL e il report li conta. | date_out_of_range |
| NaN and Infinity in numeric, real and double precision | NULLI numeri di SQL Server non hanno NaN né Infinity, quindi quei valori diventano NULL e il report li conta. | invalid_value_null |
| NOT NULL columns with values that become NULL | NOT NULL rimossoUna colonna i cui valori sono dovuti diventare NULL non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe. | not_null_relaxed |
| enum types | nvarchar con un CHECK delle sue etichetteIl testo con un vincolo CHECK mantiene gli stessi valori. | |
| enum columns holding values outside their labels | nvarchar senza CHECKI valori che le etichette non nominano violerebbero il vincolo CHECK, quindi il vincolo non viene creato. | enum_check_skipped |
| uuid, inet, cidr, macaddr | uniqueidentifier; indirizzi come nvarcharuniqueidentifier è l'UUID di SQL Server; gli indirizzi restano come testo. | |
| bytea | varbinary(max)I byte restano byte. | |
| bit(n), bit varying | bit per un bit; bigint fino a 63 bit; cifre come testo oltreUn singolo bit è un sì o un no; le stringhe di bit più lunghe sono salvate come il numero formato dai loro bit. | |
| oid, xid, cid | bigint con un CHECK che non sia negativobigint contiene ogni valore. | |
| serial, identity | IDENTITY, che riparte dopo l'id più altoGli id copiati si caricano con IDENTITY_INSERT, e il contatore riparte dopo il più alto o dal valore successivo della sequenza, quello maggiore. | |
| a second serial or identity column in a table | un intero sempliceSQL Server conta una colonna IDENTITY per tabella; ogni altra mantiene i suoi valori senza contatore. | counter_dropped |
| sequences not owned by a column | CREATE SEQUENCE ... AS bigint, con il suo valore successivoSQL Server ha sequenze con le stesse opzioni; ognuna riparte da dove l'ha lasciata il dump. | |
| generated columns | colonne calcolate, PERSISTED quando la sorgente le salvaSQL Server le calcola negli stessi due modi. | |
| generated columns with functions SQL Server lacks | una colonna semplice con i valoriUna formula che non si può scrivere per SQL Server lascia una colonna semplice con i valori del dump e una riga nel report. | generated_not_translated |
| defaults with functions SQL Server lacks, and defaults from a sequence | nessun valore predefinitoUn valore predefinito che non si può scrivere per SQL Server viene omesso e segnalato. | default_not_translated |
| CHECK constraints | tradotti, dentro CREATE TABLEI CHECK nella tabella si verificano mentre ogni riga si carica. | |
| CHECK constraints with functions SQL Server lacks | non creatoUn vincolo CHECK che non si può scrivere per SQL Server viene omesso e segnalato. | check_skipped |
| CHECK ... NOT VALID | non creatoPostgreSQL non ha mai verificato le righe che c'erano prima, quindi potrebbero violarlo. | check_not_valid |
| gin, gist, brin and hash indexes, partial and expression indexes, and indexes on text that doesn't fit a key | non creatoSQL Server indicizza colonne, non espressioni, e non nvarchar(max). | index_skipped |
| foreign keys | dopo i dati WITH NOCHECK, poi controllata con un avviso sulle righe orfaneLa chiave viene creata dopo le righe e controllata alla fine; righe senza padre la lasciano non controllata con un avviso invece di fermare il caricamento. | |
| ON DELETE or ON UPDATE that cascades in a cycle or along a second path | NO ACTIONSQL Server rifiuta le cascate che potrebbero raggiungere una tabella due volte; PostgreSQL le permette. | foreign_key_action_dropped |
| foreign keys to tables the dump doesn't create | non creatoUna chiave non può riferirsi a una tabella che non c'è. | foreign_key_skipped |
| partitioned tables | una tabella con le righe di ogni partizioneLe righe sono le stesse; partiziona di nuovo la tabella in SQL Server se serve. | partitions_dropped |
| views, functions, procedures, triggers, rules, policies, extensions and types | elencati nel reportIl loro codice è scritto nel linguaggio di PostgreSQL, quindi vengono elencati perché tu li ricrei. | not_converted_objects |
| dumps without CREATE TABLE (--data-only) | tipi ricavati dai valoriUn dump di soli dati contiene solo righe, quindi i tipi vengono ricavati dai valori. | no_schema |
| expressions in INSERT values | NULLUn convertitore che non esegue un database non può valutarle. | expression_value |
| types IntoSQL doesn't know | nvarchar(max)Il testo contiene qualsiasi valore; cambia il tipo dopo il caricamento. | unknown_type |
| text that isn't valid in its encoding | i byte errati come carattere di sostituzionenvarchar contiene testo Unicode. | invalid_utf8_replaced |
| text decoded twice (ñ) | copiato così com'èIl dump contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala. | mojibake_suspected |
Carica lo script in SQL Server
Lo script crea le tabelle, copia le righe, poi aggiunge chiavi, indici e chiavi esterne, così si carica in fretta e si ferma al primo errore.
sqlcmd -b -f 65001 -S localhost -d mydb -i postgresql.sql_server.sqlLe chiavi esterne vengono aggiunte WITH NOCHECK e poi controllate. Se una riga punta a una riga che non esiste, lo script dice quale vincolo e lo lascia non controllato, invece di fallire a metà.
Per un dump grande, esegui sqlcmd sulla stessa macchina del server. Ogni lotto di massimo 1000 righe fa il commit da solo, così il log delle transazioni resta piccolo.
Fai il dump di PostgreSQL per il miglior risultato
Il convertitore legge ciò che il dump contiene. Con queste opzioni il dump conserva più dei tuoi dati:
- --format=plain, il default di pg_dump, scrive SQL. Un archivio custom o directory (-Fc, -Fd) diventa SQL con pg_restore -f dump.sql, senza un server di database.
- --no-owner --no-privileges escludono ruoli e permessi, che il convertitore comunque salta, così il dump è più piccolo.
- pg_dumpall esporta ogni database in un solo file; le tabelle di ognuno hanno il suo nome davanti, così niente entra in conflitto.
Cosa non viene convertito
Viste, viste materializzate, funzioni, procedure, trigger, regole, policy di sicurezza a livello di riga, estensioni e tipi sono scritti nel linguaggio di PostgreSQL. Sono elencati per nome nel report, mai rimossi in silenzio, così puoi riscriverli per SQL Server.
Domande sulla conversione da PostgreSQL a SQL Server
Non trovi la risposta? Scrivici dalla pagina dei contatti e ti risponde una persona. Pagina dei contatti
Il mio dump viene caricato?
No. Il convertitore funziona nel tuo browser e legge il dump dal tuo disco a pezzi, quindi non lascia mai il tuo computer. Anche l'app desktop e la riga di comando convertono sul tuo computer.
Quanto può essere grande il dump?
Il convertitore non tiene mai l'intero dump in memoria: legge il file due volte, per intervalli, e scrive lo script man mano. I dump di più gigabyte si convertono nel browser, nell'app desktop e con la riga di comando.
Legge gli archivi pg_dump -Fc?
Non direttamente: un archivio custom è un formato binario. pg_restore -f dump.sql dump.backup lo trasforma nel SQL plain che il convertitore legge, senza connettersi a un server. Il convertitore lo dice quando riceve un archivio.
Da quali versioni di PostgreSQL può provenire il dump?
Dump scritti da pg_dump e pg_dumpall da PostgreSQL 10 in poi, con righe COPY o INSERT. Ogni dump di test viene da PostgreSQL 13 e 18 ed è confrontato con la sorgente cella per cella.
I valori serial e identity vengono mantenuti?
Sì. La colonna serial o identity di ogni tabella diventa una colonna IDENTITY, ogni riga mantiene il suo id e l'id successivo riparte dopo il più alto. SQL Server conta una colonna per tabella, quindi ogni altra mantiene i suoi valori senza contatore.
Cosa succede ad array, enum e altri tipi di PostgreSQL?
Gli array diventano array JSON, i booleani bit, uuid uniqueidentifier e i timestamp con fuso orario datetimeoffset. Il testo si confronta in modo esatto, come in PostgreSQL, e citext ignorando le maiuscole. Range, tipi geometrici e tipi composti mantengono il testo di PostgreSQL.
E funzioni, trigger e viste?
Sono elencati per nome nel report e non vengono convertiti, perché ogni database li scrive nel proprio linguaggio.
Su quali versioni di SQL Server si carica lo script?
SQL Server dalla 2017 alla 2025. Lo stesso script si carica su ognuna, fermandosi al primo errore se qualcosa va storto.