2

I'm trying to do some slow migration from a MS SQL Server 2008 R2 to a PostgreSQL 9.5 + PostGIS.

I created a FDW in PostgreSQL to access my MSSQL data and I imported most of my tables, but a few didn't make It.

Here is an exemple:

CREATE FOREIGN TABLE ms_table_name(
col1 varchar (64), col2 date, geometry geometry
) SERVER mssql_db_server OPTIONS (query 'SELECT col1, col2, cast(geometry.STAsText() as varchar(max)) "geometry" FROM ms_table_name', 
row_estimate_method 'showplan_all');
 CREATE TABLE pg_table_name AS (select * from ms_table_name);
 ALTER TABLE pg_table_name ADD oid serial PRIMARY KEY;
 CREATE INDEX pg_table_name_gix ON pg_table_name USING GIST (GEOMETRY);

I can't use binary because it returns two invalid characters, that's why I need to convert it to text.

As I said, it works for most geometries but for long/big geometries that have a large number of coordinates, it gets truncated.

ERRO: parse error - invalid geometry SQL state: XX000 Hint: "...65032851836 8268588.7680116147, 6129" <-- parse error at position 64513 within geometry

This geometry has 138280 chars, I confirmed all chars are being sent from MSSQL but PosgreSQL only reads 64512. I tried varchar, text, but still I get this 64512 char limit!

How do I work around it?

kttii
3,6601 gold badge18 silver badges36 bronze badges
asked Sep 23, 2016 at 14:31
2
  • 1
    If you can dump from SQL Server to txt and then load that using LOAD DATA ... etc and finally convert your text column to geom using ST_GeomFromText, you will likely succeed. Given that you have to convert from text to geom anyway, you aren't adding any extra steps this way. Commented Sep 23, 2016 at 16:41
  • Unfortunately I don't have access and the DBA doesn't look like is going to give me access any time soon... I'm able to send the table from MSSQL to PGSQL using QGIS (simple drag and drop(!)) but I would like to have something more dynamic and autonomous Commented Sep 23, 2016 at 19:17

1 Answer 1

2

Maybe use an FDW with explicit support for spatial? OGR FDW does what you need, and there is a windows build.

WRT the specifics of your question, the maximum value of 64512 is suspiciously close to the maximum size of a short, 65536. Perhaps you're hitting a max string length limit somewhere in the stack.

answered Sep 23, 2016 at 16:41
1
  • I did tried OGR_FDW but somewhat It is worse than TDS_FDW. CREATE SERVER ogr_mssql_server FOREIGN DATA WRAPPER ogr_fdw OPTIONS (datasource 'ODBC:user/password@mssql_server',format 'ODBC'); ALTER SERVER ogr_mssql_server OWNER TO postgres; and the table: CREATE FOREIGN TABLE ogr_ms_table (id int,geom geometry) SERVER ogr_mssql_server OPTIONS ( layer 'dbo.ms_table' ) I can access the non-spatial data, but no spatial data is sent. I tried using bytea and ST_GeomFromWKB(geometry) but the coordinates get all messed up Commented Sep 23, 2016 at 19:08

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.