---
title: "Migrar PostgreSQL a SQL Server en tu navegador"
description: "Migra una base de datos PostgreSQL a SQL Server: convierte un archivo de pg_dump en un script con las mismas tablas, claves y datos, y un informe de cada cambio."
canonical: https://intosql.com/es/postgresql-a-sql-server
last_updated: 2026-10-15
---

# Migrar PostgreSQL a SQL Server en tu navegador

Suelta un volcado plano de pg_dump o pg_dumpall, en .sql o .sql.gz, y descarga un script de SQL Server con las mismas tablas, claves, índices y datos. Cada valor que SQL Server no puede guardar tal cual, y cada objeto que no admite, aparece en el informe.

[Guía de migración de PostgreSQL a SQL Server](https://intosql.com/docs/migrations/postgresql-to-sql-server)

[Tipos de datos de PostgreSQL a SQL Server](https://intosql.com/docs/types/postgresql-to-sql-server)

## Qué cambia de PostgreSQL a SQL Server

Cada fila es una regla que aplica el convertidor, con la línea que escribe en el informe cuando la regla cambia algo en tus datos.

| En PostgreSQL | En SQL Server | Línea del informe |
| --- | --- | --- |
| boolean | bit |  |
| varchar(n), char(n), text | nvarchar(n); text como nvarchar(max), o nvarchar(450) cuando una clave lo usa y cada valor cabe |  |
| text comparison | exacta (Latin1_General_100_BIN2); citext sin distinguir mayúsculas (Latin1_General_100_CI_AS_SC) |  |
| numeric(p,s) past 38 digits; numeric without a precision | nvarchar; decimal(p,s) ajustado a los valores cuando caben en 38 dígitos | `decimal_as_text` |
| money | decimal(19,2) | `type_replaced` |
| interval | nvarchar(100) con el texto de PostgreSQL | `type_replaced` |
| arrays (integer[], text[]...) | nvarchar(max) con un arreglo JSON | `type_replaced` |
| ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension types | nvarchar(max) con el texto de PostgreSQL | `type_replaced` |
| json, jsonb | nvarchar(max) |  |
| timestamp | datetime2 |  |
| timestamp with time zone | datetimeoffset en 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 | sin NOT NULL | `not_null_relaxed` |
| enum types | nvarchar con un CHECK de sus etiquetas |  |
| enum columns holding values outside their labels | nvarchar sin CHECK | `enum_check_skipped` |
| uuid, inet, cidr, macaddr | uniqueidentifier; direcciones como nvarchar |  |
| bytea | varbinary(max) |  |
| bit(n), bit varying | bit para un bit; bigint hasta 63 bits; dígitos en texto si son más |  |
| oid, xid, cid | bigint con un CHECK de que no sea negativo |  |
| serial, identity | IDENTITY, siguiendo después del id más alto |  |
| a second serial or identity column in a table | un entero simple | `counter_dropped` |
| sequences not owned by a column | CREATE SEQUENCE ... AS bigint, con su siguiente valor |  |
| generated columns | columnas calculadas, PERSISTED cuando el origen las guarda |  |
| generated columns with functions SQL Server lacks | una columna simple con los valores | `generated_not_translated` |
| defaults with functions SQL Server lacks, and defaults from a sequence | sin valor predeterminado | `default_not_translated` |
| CHECK constraints | traducido, en línea en CREATE TABLE |  |
| CHECK constraints with functions SQL Server lacks | no se crea | `check_skipped` |
| CHECK ... NOT VALID | no se crea | `check_not_valid` |
| gin, gist, brin and hash indexes, partial and expression indexes, and indexes on text that doesn't fit a key | no se crea | `index_skipped` |
| foreign keys | después de los datos, WITH NOCHECK, luego comprobada con una advertencia si hay huérfanas |  |
| 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 | no se crea | `foreign_key_skipped` |
| partitioned tables | una tabla con las filas de todas las particiones | `partitions_dropped` |
| views, functions, procedures, triggers, rules, policies, extensions and types | listados en el informe | `not_converted_objects` |
| dumps without CREATE TABLE (--data-only) | tipos leídos de los valores | `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 | los bytes incorrectos como carácter de reemplazo | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | se copia tal cual | `mojibake_suspected` |

## Carga el script en SQL Server

El script crea las tablas, copia las filas y luego agrega claves, índices y claves foráneas, así que carga rápido y se detiene en el primer error.

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

Las claves foráneas se agregan WITH NOCHECK y luego se comprueban. Si una fila apunta a una fila que no existe, el script dice qué restricción es y la deja sin comprobar, en lugar de fallar a medias.

Para un volcado grande, ejecuta sqlcmd en la misma máquina que el servidor. Cada lote de hasta 1000 filas se confirma por separado, así que el registro de transacciones se mantiene pequeño.

## Haz el volcado de PostgreSQL para el mejor resultado

El convertidor lee lo que contiene el volcado. Estas opciones conservan más de tus datos en él:

- --format=plain, el formato predeterminado de pg_dump, escribe SQL. Un archivo custom o de directorio (-Fc, -Fd) pasa a SQL con pg_restore -f dump.sql, sin un servidor de base de datos.
- --no-owner --no-privileges dejan fuera los roles y los permisos, que el convertidor omite de todos modos, así que el volcado es más pequeño.
- pg_dumpall vuelca todas las bases de datos en un archivo; las tablas de cada una llevan su nombre, así que nada choca.

## Qué no se convierte

Las vistas, vistas materializadas, funciones, procedimientos, disparadores, reglas, políticas de seguridad de filas, extensiones y tipos se escriben en el lenguaje propio de PostgreSQL. Aparecen en el informe por nombre, nunca se descartan en silencio, para que puedas reescribirlos para SQL Server.

## Preguntas sobre PostgreSQL a SQL Server

### ¿Se sube mi volcado?

No. El convertidor se ejecuta en tu navegador y lee el volcado de tu disco por partes, así que nunca sale de tu computadora. La app de escritorio y la línea de comandos también convierten en tu computadora.

### ¿Qué tan grande puede ser el volcado?

El convertidor nunca tiene todo el volcado en memoria: lee el archivo dos veces, por rangos, y escribe el script sobre la marcha. Los volcados de varios gigabytes se convierten en el navegador, en la app de escritorio y con la línea de comandos.

### ¿Lee archivos de pg_dump -Fc?

No directamente: un archivo custom tiene formato binario. pg_restore -f dump.sql dump.backup lo pasa al SQL plano que lee el convertidor, sin conectarse a un servidor. El convertidor lo indica cuando recibe un archivo así.

### ¿De qué versiones de PostgreSQL puede venir el volcado?

Volcados escritos por pg_dump y pg_dumpall de PostgreSQL 10 en adelante, con filas COPY o INSERT. Cada volcado de prueba viene de PostgreSQL 13 y 18 y se compara con su origen celda por celda.

### ¿Se conservan los valores serial e identity?

Sí. La columna serial o identity de cada tabla se vuelve una columna IDENTITY, cada fila conserva su id y el siguiente id sigue después del más alto. SQL Server cuenta una columna por tabla, así que cualquier otra conserva sus valores sin contador.

### ¿Qué pasa con los arreglos, los enum y otros tipos de PostgreSQL?

Los arreglos se vuelven arreglos JSON, los booleanos bit, uuid uniqueidentifier y los timestamps con zona horaria datetimeoffset. El texto se compara exactamente, como en PostgreSQL, y citext sin distinguir mayúsculas. Los rangos, los tipos geométricos y los tipos compuestos conservan el texto de PostgreSQL.

### ¿Qué pasa con las funciones, los disparadores y las vistas?

Aparecen en el informe por nombre y no se convierten, porque cada base de datos los escribe en su propio lenguaje.

### ¿En qué versiones de SQL Server carga el script?

SQL Server 2017 a 2025. El mismo script carga en cada una, y se detiene en el primer error si algo sale mal.

## Desde PostgreSQL

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

## Hacia SQL Server

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

## Guía y todos los pares

- [SQL Server a PostgreSQL](https://intosql.com/es/sql-server-a-postgresql)
- [Guía de migración de PostgreSQL a SQL Server](https://intosql.com/docs/migrations/postgresql-to-sql-server)
- [Tipos de datos de PostgreSQL a SQL Server](https://intosql.com/docs/types/postgresql-to-sql-server)
- [Todos los pares de bases de datos](https://intosql.com/es/migracion-de-bases-de-datos)
