Saltar al contenido
Inicio de IntoSQL

Convierte PostgreSQL a SQL Server

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.

Tu archivo
sqlshop_2024_postgres.sqlArchivo de ejemplo, 6,2 kB
Tu base de datos

18 filas convertidas, 2 correcciones, ninguna rechazada

Mostrar

Tablas en shop_2024_postgres.sqlVolcado de PostgreSQL 18.6 · escrito por pg_dump · utf8mb4

  • customers8 filas1
    8 columnas
    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 filas1
    10 columnas
    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)

Sin convertir

  • Vista paid_orders

Cada base de datos los escribe en su propio lenguaje. Reescríbelos para 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

Correcciones

  1. "tags" de customers es text[], que SQL Server no tiene, así que es nvarchar(max) con los mismos valores.
  2. "delivery" de orders es interval, que SQL Server no tiene, así que es nvarchar(100) con los mismos valores.

Para revisar

  • 1 vista, disparador, rutina o evento no se convierte; el informe lista cada uno. Vuelve a crearlos a mano en SQL Server.
  • El valor predeterminado de "tags" en customers no se puede escribir para SQL Server (a value its type can't hold), así que la columna no tiene valor predeterminado. Agrega el valor predeterminado a mano si las filas nuevas lo necesitan.
  • El índice idx_orders_details de orders usa una expresión que no se puede escribir para SQL Server (an index on an expression), así que no se crea. Crea el índice a mano si las consultas lo necesitan.
  • 1 valor en "shipped_at" de orders es una fecha que SQL Server no puede guardar, como infinity, así que queda en NULL. SQL Server guarda los años 1 a 9999 sin infinito; reemplaza esas fechas en el origen si importan.

Tu archivo se convierte en esta computadora y nunca se sube.

Otros ejemplos:

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.

  • boolean

    bit

    bit guarda true como 1 y false como 0.

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

    nvarchar(n); text como nvarchar(max), o nvarchar(450) cuando una clave lo usa y cada valor cabe

    nvarchar admite cualquier carácter. SQL Server no puede indexar nvarchar(max), así que el texto en una clave se dimensiona para caber en una clave.

  • text comparison

    exacta (Latin1_General_100_BIN2); citext sin distinguir mayúsculas (Latin1_General_100_CI_AS_SC)

    La intercalación habitual de SQL Server no distingue mayúsculas y el text de PostgreSQL sí, así que cada columna indica cómo compara y las claves únicas mantienen distintas las mismas filas.

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

    nvarchar; decimal(p,s) ajustado a los valores cuando caben en 38 dígitos

    El decimal de SQL Server admite 38 dígitos. Un numeric sin precisión recibe el decimal más estrecho en que caben sus valores; los números más anchos se guardan como texto para que cada dígito siga exacto.

    Línea del informe: decimal_as_text

  • money

    decimal(19,2)

    El money de SQL Server es más pequeño que el de PostgreSQL y tiene cuatro decimales; decimal(19,2) admite cada importe, sin el símbolo de moneda que agregó la configuración regional del servidor.

    Línea del informe: type_replaced

  • interval

    nvarchar(100) con el texto de PostgreSQL

    SQL Server no tiene tipo interval; el texto conserva cada parte.

    Línea del informe: type_replaced

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

    nvarchar(max) con un arreglo JSON

    SQL Server no tiene arreglos. Un arreglo JSON conserva cada elemento y NULL, y OPENJSON lo lee.

    Línea del informe: type_replaced

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

    nvarchar(max) con el texto de PostgreSQL

    SQL Server no tiene un tipo equivalente, así que cada valor conserva el texto que escribió PostgreSQL.

    Línea del informe: type_replaced

  • json, jsonb

    nvarchar(max)

    Las funciones JSON de SQL Server leen JSON desde texto.

  • timestamp

    datetime2

    Un timestamp sin zona horaria es una lectura de reloj, como datetime2.

  • timestamp with time zone

    datetimeoffset en UTC

    datetimeoffset conserva el instante; cada valor se escribe en UTC, el mismo instante sea cual sea el desfase que escribió el volcado.

  • time with 24:00:00 in it

    nvarchar(17)

    El time de SQL Server termina en 23:59:59.9999999, así que una columna con 24:00:00 conserva su texto.

    Línea del informe: time_as_interval

  • infinity, -infinity and BC dates

    NULL

    SQL Server guarda los años 1 a 9999 sin infinito. Esos valores se vuelven NULL y el informe los cuenta.

    Línea del informe: date_out_of_range

  • NaN and Infinity in numeric, real and double precision

    NULL

    Los números de SQL Server no tienen NaN ni Infinity, así que esos valores se vuelven NULL y el informe los cuenta.

    Línea del informe: invalid_value_null

  • NOT NULL columns with values that become NULL

    sin NOT NULL

    Una columna cuyos valores tuvieron que volverse NULL no puede conservar NOT NULL, o la carga se detendría.

    Línea del informe: not_null_relaxed

  • enum types

    nvarchar con un CHECK de sus etiquetas

    El texto con un CHECK conserva los mismos valores.

  • enum columns holding values outside their labels

    nvarchar sin CHECK

    Los valores que las etiquetas no nombran no cumplirían el CHECK, así que el CHECK no se crea.

    Línea del informe: enum_check_skipped

  • uuid, inet, cidr, macaddr

    uniqueidentifier; direcciones como nvarchar

    uniqueidentifier es el UUID de SQL Server; las direcciones se guardan como texto.

  • bytea

    varbinary(max)

    Los bytes siguen siendo bytes.

  • bit(n), bit varying

    bit para un bit; bigint hasta 63 bits; dígitos en texto si son más

    Un solo bit es un sí o un no; las cadenas de bits más largas se guardan como el número que forman sus bits.

  • oid, xid, cid

    bigint con un CHECK de que no sea negativo

    bigint admite cada valor.

  • serial, identity

    IDENTITY, siguiendo después del id más alto

    Los ids copiados se cargan con IDENTITY_INSERT, y el contador sigue después del más alto o del siguiente valor de la secuencia, el que sea mayor.

  • a second serial or identity column in a table

    un entero simple

    SQL Server cuenta una columna IDENTITY por tabla; cualquier otra conserva sus valores sin contador.

    Línea del informe: counter_dropped

  • sequences not owned by a column

    CREATE SEQUENCE ... AS bigint, con su siguiente valor

    SQL Server tiene secuencias con las mismas opciones; cada una sigue donde la dejó el volcado.

  • generated columns

    columnas calculadas, PERSISTED cuando el origen las guarda

    SQL Server las calcula de las mismas dos formas.

  • generated columns with functions SQL Server lacks

    una columna simple con los valores

    Una fórmula que no se puede escribir para SQL Server deja una columna simple con los valores del volcado y una línea en el informe.

    Línea del informe: generated_not_translated

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

    sin valor predeterminado

    Un valor predeterminado que no se puede escribir para SQL Server se deja fuera y aparece en el informe.

    Línea del informe: default_not_translated

  • CHECK constraints

    traducido, en línea en CREATE TABLE

    Los CHECK en línea se comprueban al cargar cada fila.

  • CHECK constraints with functions SQL Server lacks

    no se crea

    Un CHECK que no se puede escribir para SQL Server se deja fuera y aparece en el informe.

    Línea del informe: check_skipped

  • CHECK ... NOT VALID

    no se crea

    PostgreSQL nunca comprobó las filas que ya estaban, así que pueden no cumplirlo.

    Línea del informe: 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

    SQL Server indexa columnas, no expresiones, y no nvarchar(max).

    Línea del informe: index_skipped

  • foreign keys

    después de los datos, WITH NOCHECK, luego comprobada con una advertencia si hay huérfanas

    La clave se crea después de las filas y se comprueba al final; las filas sin padre la dejan sin comprobar con una advertencia en lugar de detener la carga.

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

    NO ACTION

    SQL Server rechaza las propagaciones que podrían llegar dos veces a una tabla; PostgreSQL las permite.

    Línea del informe: foreign_key_action_dropped

  • foreign keys to tables the dump doesn't create

    no se crea

    Una clave no puede nombrar una tabla que no existe.

    Línea del informe: foreign_key_skipped

  • partitioned tables

    una tabla con las filas de todas las particiones

    Las filas son las mismas; vuelve a particionar la tabla en SQL Server si lo necesita.

    Línea del informe: partitions_dropped

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

    listados en el informe

    Su código está escrito en el lenguaje de PostgreSQL, así que se listan para que los vuelvas a crear.

    Línea del informe: not_converted_objects

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

    tipos leídos de los valores

    Un volcado solo de datos solo tiene filas, así que los tipos salen de los valores.

    Línea del informe: no_schema

  • expressions in INSERT values

    NULL

    Un convertidor que no ejecuta una base de datos no puede evaluarlas.

    Línea del informe: expression_value

  • types IntoSQL doesn't know

    nvarchar(max)

    El texto admite cualquier valor; cambia el tipo después de cargar.

    Línea del informe: unknown_type

  • text that isn't valid in its encoding

    los bytes incorrectos como carácter de reemplazo

    nvarchar contiene texto Unicode.

    Línea del informe: invalid_utf8_replaced

  • text decoded twice (ñ)

    se copia tal cual

    El volcado contiene exactamente estos caracteres, así que se copian; el informe los señala.

    Línea del informe: mojibake_suspected

En PostgreSQLEn SQL ServerLínea del informe
booleanbitbit guarda true como 1 y false como 0.
varchar(n), char(n), textnvarchar(n); text como nvarchar(max), o nvarchar(450) cuando una clave lo usa y cada valor cabenvarchar admite cualquier carácter. SQL Server no puede indexar nvarchar(max), así que el texto en una clave se dimensiona para caber en una clave.
text comparisonexacta (Latin1_General_100_BIN2); citext sin distinguir mayúsculas (Latin1_General_100_CI_AS_SC)La intercalación habitual de SQL Server no distingue mayúsculas y el text de PostgreSQL sí, así que cada columna indica cómo compara y las claves únicas mantienen distintas las mismas filas.
numeric(p,s) past 38 digits; numeric without a precisionnvarchar; decimal(p,s) ajustado a los valores cuando caben en 38 dígitosEl decimal de SQL Server admite 38 dígitos. Un numeric sin precisión recibe el decimal más estrecho en que caben sus valores; los números más anchos se guardan como texto para que cada dígito siga exacto.decimal_as_text
moneydecimal(19,2)El money de SQL Server es más pequeño que el de PostgreSQL y tiene cuatro decimales; decimal(19,2) admite cada importe, sin el símbolo de moneda que agregó la configuración regional del servidor.type_replaced
intervalnvarchar(100) con el texto de PostgreSQLSQL Server no tiene tipo interval; el texto conserva cada parte.type_replaced
arrays (integer[], text[]...)nvarchar(max) con un arreglo JSONSQL Server no tiene arreglos. Un arreglo JSON conserva cada elemento y NULL, y OPENJSON lo lee.type_replaced
ranges, geometric types, tsvector, xml, hstore, PostGIS, composite and extension typesnvarchar(max) con el texto de PostgreSQLSQL Server no tiene un tipo equivalente, así que cada valor conserva el texto que escribió PostgreSQL.type_replaced
json, jsonbnvarchar(max)Las funciones JSON de SQL Server leen JSON desde texto.
timestampdatetime2Un timestamp sin zona horaria es una lectura de reloj, como datetime2.
timestamp with time zonedatetimeoffset en UTCdatetimeoffset conserva el instante; cada valor se escribe en UTC, el mismo instante sea cual sea el desfase que escribió el volcado.
time with 24:00:00 in itnvarchar(17)El time de SQL Server termina en 23:59:59.9999999, así que una columna con 24:00:00 conserva su texto.time_as_interval
infinity, -infinity and BC datesNULLSQL Server guarda los años 1 a 9999 sin infinito. Esos valores se vuelven NULL y el informe los cuenta.date_out_of_range
NaN and Infinity in numeric, real and double precisionNULLLos números de SQL Server no tienen NaN ni Infinity, así que esos valores se vuelven NULL y el informe los cuenta.invalid_value_null
NOT NULL columns with values that become NULLsin NOT NULLUna columna cuyos valores tuvieron que volverse NULL no puede conservar NOT NULL, o la carga se detendría.not_null_relaxed
enum typesnvarchar con un CHECK de sus etiquetasEl texto con un CHECK conserva los mismos valores.
enum columns holding values outside their labelsnvarchar sin CHECKLos valores que las etiquetas no nombran no cumplirían el CHECK, así que el CHECK no se crea.enum_check_skipped
uuid, inet, cidr, macaddruniqueidentifier; direcciones como nvarcharuniqueidentifier es el UUID de SQL Server; las direcciones se guardan como texto.
byteavarbinary(max)Los bytes siguen siendo bytes.
bit(n), bit varyingbit para un bit; bigint hasta 63 bits; dígitos en texto si son másUn solo bit es un sí o un no; las cadenas de bits más largas se guardan como el número que forman sus bits.
oid, xid, cidbigint con un CHECK de que no sea negativobigint admite cada valor.
serial, identityIDENTITY, siguiendo después del id más altoLos ids copiados se cargan con IDENTITY_INSERT, y el contador sigue después del más alto o del siguiente valor de la secuencia, el que sea mayor.
a second serial or identity column in a tableun entero simpleSQL Server cuenta una columna IDENTITY por tabla; cualquier otra conserva sus valores sin contador.counter_dropped
sequences not owned by a columnCREATE SEQUENCE ... AS bigint, con su siguiente valorSQL Server tiene secuencias con las mismas opciones; cada una sigue donde la dejó el volcado.
generated columnscolumnas calculadas, PERSISTED cuando el origen las guardaSQL Server las calcula de las mismas dos formas.
generated columns with functions SQL Server lacksuna columna simple con los valoresUna fórmula que no se puede escribir para SQL Server deja una columna simple con los valores del volcado y una línea en el informe.generated_not_translated
defaults with functions SQL Server lacks, and defaults from a sequencesin valor predeterminadoUn valor predeterminado que no se puede escribir para SQL Server se deja fuera y aparece en el informe.default_not_translated
CHECK constraintstraducido, en línea en CREATE TABLELos CHECK en línea se comprueban al cargar cada fila.
CHECK constraints with functions SQL Server lacksno se creaUn CHECK que no se puede escribir para SQL Server se deja fuera y aparece en el informe.check_skipped
CHECK ... NOT VALIDno se creaPostgreSQL nunca comprobó las filas que ya estaban, así que pueden no cumplirlo.check_not_valid
gin, gist, brin and hash indexes, partial and expression indexes, and indexes on text that doesn't fit a keyno se creaSQL Server indexa columnas, no expresiones, y no nvarchar(max).index_skipped
foreign keysdespués de los datos, WITH NOCHECK, luego comprobada con una advertencia si hay huérfanasLa clave se crea después de las filas y se comprueba al final; las filas sin padre la dejan sin comprobar con una advertencia en lugar de detener la carga.
ON DELETE or ON UPDATE that cascades in a cycle or along a second pathNO ACTIONSQL Server rechaza las propagaciones que podrían llegar dos veces a una tabla; PostgreSQL las permite.foreign_key_action_dropped
foreign keys to tables the dump doesn't createno se creaUna clave no puede nombrar una tabla que no existe.foreign_key_skipped
partitioned tablesuna tabla con las filas de todas las particionesLas filas son las mismas; vuelve a particionar la tabla en SQL Server si lo necesita.partitions_dropped
views, functions, procedures, triggers, rules, policies, extensions and typeslistados en el informeSu código está escrito en el lenguaje de PostgreSQL, así que se listan para que los vuelvas a crear.not_converted_objects
dumps without CREATE TABLE (--data-only)tipos leídos de los valoresUn volcado solo de datos solo tiene filas, así que los tipos salen de los valores.no_schema
expressions in INSERT valuesNULLUn convertidor que no ejecuta una base de datos no puede evaluarlas.expression_value
types IntoSQL doesn't knownvarchar(max)El texto admite cualquier valor; cambia el tipo después de cargar.unknown_type
text that isn't valid in its encodinglos bytes incorrectos como carácter de reemplazonvarchar contiene texto Unicode.invalid_utf8_replaced
text decoded twice (ñ)se copia tal cualEl volcado contiene exactamente estos caracteres, así que se copian; el informe los señala.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.

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

¿No encuentras la respuesta? Escríbenos desde la página de contacto y te responde una persona. Página de contacto

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