---
title: "Migrare PostgreSQL a SQL Server nel browser"
description: "Migra un database PostgreSQL a SQL Server: converti un file pg_dump in uno script con le stesse tabelle, chiavi e dati, e un report di ogni modifica."
canonical: https://intosql.com/it/postgresql-in-sql-server
last_updated: 2026-10-15
---

# Migrare PostgreSQL a SQL Server nel browser

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.

[Guida alla migrazione da PostgreSQL a SQL Server](https://intosql.com/docs/migrations/postgresql-to-sql-server)

[Tipi di dati da PostgreSQL a SQL Server](https://intosql.com/docs/types/postgresql-to-sql-server)

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

| In PostgreSQL | In SQL Server | Riga del report |
| --- | --- | --- |
| boolean | bit |  |
| varchar(n), char(n), text | nvarchar(n); text come nvarchar(max), o nvarchar(450) quando una chiave lo usa e ogni valore ci sta |  |
| text comparison | esatto (Latin1_General_100_BIN2); citext ignorando le maiuscole (Latin1_General_100_CI_AS_SC) |  |
| numeric(p,s) past 38 digits; numeric without a precision | nvarchar; decimal(p,s) adattato ai valori quando stanno in 38 cifre | `decimal_as_text` |
| money | decimal(19,2) | `type_replaced` |
| interval | nvarchar(100) con il testo di PostgreSQL | `type_replaced` |
| arrays (integer[], text[]...) | nvarchar(max) con un array JSON | `type_replaced` |
| ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types | nvarchar(max) con il testo di PostgreSQL | `type_replaced` |
| json, jsonb | nvarchar(max) |  |
| timestamp | datetime2 |  |
| timestamp with time zone | datetimeoffset in UTC |  |
| time with 24:00:00 in it | nvarchar(17) | `time_as_interval` |
| infinity, -infinity and BC dates | NULL | `date_out_of_range` |
| NaN and Infinity in numeric, real and double precision | NULL | `invalid_value_null` |
| NOT NULL columns with values that become NULL | NOT NULL rimosso | `not_null_relaxed` |
| enum types | nvarchar con un CHECK delle sue etichette |  |
| enum columns holding values outside their labels | nvarchar senza CHECK | `enum_check_skipped` |
| uuid, inet, cidr, macaddr | uniqueidentifier; indirizzi come nvarchar |  |
| bytea | varbinary(max) |  |
| bit(n), bit varying | bit per un bit; bigint fino a 63 bit; cifre come testo oltre |  |
| oid, xid, cid | bigint con un CHECK che non sia negativo |  |
| serial, identity | IDENTITY, che riparte dopo l'id più alto |  |
| a second serial or identity column in a table | un intero semplice | `counter_dropped` |
| sequences not owned by a column | CREATE SEQUENCE ... AS bigint, con il suo valore successivo |  |
| generated columns | colonne calcolate, PERSISTED quando la sorgente le salva |  |
| generated columns with functions SQL Server lacks | una colonna semplice con i valori | `generated_not_translated` |
| defaults with functions SQL Server lacks, and defaults from a sequence | nessun valore predefinito | `default_not_translated` |
| CHECK constraints | tradotti, dentro CREATE TABLE |  |
| CHECK constraints with functions SQL Server lacks | non creato | `check_skipped` |
| CHECK ... NOT VALID | non creato | `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 | `index_skipped` |
| foreign keys | dopo i dati WITH NOCHECK, poi controllata con un avviso sulle righe orfane |  |
| ON DELETE or ON UPDATE that cascades in a cycle or along a second path | NO ACTION | `foreign_key_action_dropped` |
| foreign keys to tables the dump doesn't create | non creato | `foreign_key_skipped` |
| partitioned tables | una tabella con le righe di ogni partizione | `partitions_dropped` |
| views, functions, procedures, triggers, rules, policies, extensions and types | elencati nel report | `not_converted_objects` |
| dumps without CREATE TABLE (--data-only) | tipi ricavati dai valori | `no_schema` |
| expressions in INSERT values | NULL | `expression_value` |
| types IntoSQL doesn't know | nvarchar(max) | `unknown_type` |
| text that isn't valid in its encoding | i byte errati come carattere di sostituzione | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | copiato così com'è | `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.

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

Le 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

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

## Da PostgreSQL

- [Da PostgreSQL a PostgreSQL](https://intosql.com/it/postgresql-in-postgresql)
- [Da PostgreSQL a MySQL](https://intosql.com/it/postgresql-in-mysql)
- [Da PostgreSQL a MariaDB](https://intosql.com/it/postgresql-in-mariadb)
- [Da PostgreSQL a SQLite](https://intosql.com/it/postgresql-in-sqlite)
- [Da PostgreSQL a Oracle](https://intosql.com/it/postgresql-in-oracle)

## Verso SQL Server

- [Da MySQL a SQL Server](https://intosql.com/it/mysql-in-sql-server)
- [Da MariaDB a SQL Server](https://intosql.com/it/mariadb-in-sql-server)
- [Da SQL Server a SQL Server](https://intosql.com/it/sql-server-in-sql-server)
- [Da SQLite a SQL Server](https://intosql.com/it/sqlite-in-sql-server)
- [Da Oracle a SQL Server](https://intosql.com/it/oracle-in-sql-server)

## Guida e tutte le coppie

- [Da SQL Server a PostgreSQL](https://intosql.com/it/sql-server-in-postgresql)
- [Guida alla migrazione da PostgreSQL a SQL Server](https://intosql.com/docs/migrations/postgresql-to-sql-server)
- [Tipi di dati da PostgreSQL a SQL Server](https://intosql.com/docs/types/postgresql-to-sql-server)
- [Tutte le coppie di database](https://intosql.com/it/migrazione-database)
