none
Linked Server für PostgreSQL/PostGIS RRS feed

  • Allgemeine Diskussion

  • Hallo Leute,

    Ich habe folgendes Problem:

    Ich habe Lokal eine PostgreSQL Datenbank mit der räumlichen erweiterung  PostGIS. Was ich gerne möchte ist, dass ich über das Microsoft SQL Server Managament Studio diese Datenbank anspreche.
    Das ganze funktioniert leider nur zu einem Teil, ich habe es geschafft eine Verbindung aufzubauen und Querys zu erstellen. Jedoch funtioniert das ganze nicht wenn in einem Table eine Geometry Spalte inkludiert ist. Wenn ich dann eine Abfrage erstelle kommt folgende Fehlermeldung:

    Msg 7356, Level 16, State 1, Line 1
    The OLE DB provider "MSDASQL" for linked server "LOCAL POSTGRESQL" supplied inconsistent metadata for a column. The column "geom" (compile-time ordinal 8) of object ""postgis"."public"."kg"" was reported to have a "DBCOLUMNFLAGS_ISLONG" of 128 at compile time and 0 at run time.

    Mein allgemeines Vorgehen zur erstellen der Verbindung habe ich hier abgeschaut
    https://www.mssqltips.com/sqlservertip/3662/sql-server-and-postgresql-linked-server-configuration--part-2/

    Ich hoffe ihr könnt mir weiterhelfen.
    Mittwoch, 3. Februar 2016 14:03

Alle Antworten

  • Hallo,

    bei Abfragen über einen Linked Server muss der SQL Server die Datentypen der externen Quelle auf die eigenen Typen mappen; kennt der SQL Server kein Äquivalent, dann kann man die Daten auch nicht über einen Linked Server abfragen. In dem Falle musst Du die Daten bereits in der Abfrage so konvertieren, das der SQL Server damit was anfangen kann; bei Spatial Data z.B. in die textuelle Darstellung der Geometry Daten.

    Wieso willst Du den Umweg über einen Linked Server gehen? Es gibt doch mit Sicherheit auch vernünftige Tools für PostgresSQL um die Abfragen auszuführen.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 4. Februar 2016 07:31
  • Hallo Stefan,

    mit speziellen Datentypen kann es schon Probleme geben. Nur weil SQL Server und PostgreSQL etwas Geometry nennen, ist längst nicht (annhähernd) das Gleiche.

    Versuche die Daten in einen "gängigen" Typ umzuwandeln, sei es Zeichenkette, decimal etc. Siehe dazu auch: http://stackoverflow.com/questions/28739011/mssql-linked-server-supplied-inconsistent-metadata-for-a-column

    Gruß Elmar

    Donnerstag, 4. Februar 2016 09:00
    Beantworter
  • Hallo,

    ok danke.
    Ich hab das jetzt mal so gemacht,

    select Convert(geometry, GEOMETRY::STGeomFromText(geom, 31255)) from [LOCAL POSTGRESQL].[postgis].[public].[kg] 
    und bekomme aber trotzdem den gleichen Fehler.



    Meiner Meinung nach ist das die beste Lösung, da unsere Hauptapplikation mit einer MSSQL Datenbank läuft. Unser Aufbaumodul GIS soll in PostgreSQL sein und wir benötigen aber in manchen Fällen informationen von der jeweiligen anderen Datenbank.

    Gibt es eine geschicktere Lösung?

    Donnerstag, 4. Februar 2016 10:31
  • Hallo Stefan,

    das hast Du missverstanden, die Konvertierung muss bereits auf PostGreSQL Seite erfolgen, das geht indem Du OPENQUERY (Transact-SQL) verwendest und da einen SQL String mit der Abfrage übergibst, die die Daten konvertiert. Prinzipiell also so:

    SELECT *
    FROM OPENQUERY([LOCAL POSTGRESQL],
                   'SELECT CONVERT(....) AS geom from [postgis].[public].[kg]') AS Qry


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 4. Februar 2016 10:33
  • Hey

    Großes Lob an euch, das ihr so auf zack seit!!

    Ich habe statt deinen punkten vollgendes hineingeschrieben

    ... CONVERT(geometry, geom, 31255) ...


    Fehlermeldungen sind diese zwei:

    Msg 7399, Level 16, State 1, Line 4
    The OLE DB provider "MSDASQL" for linked server "LOCAL POSTGRESQL" reported an error. The provider did not give any information about the error.
    Msg 7350, Level 16, State 2, Line 4
    Cannot get the column information from OLE DB provider "MSDASQL" for linked server "LOCAL POSTGRESQL".

    Woran scheitere ich denn nun?

    Donnerstag, 4. Februar 2016 11:16
  • Nun, da tippe ich mal darauf, das PostGreSQL die CONVERT Funktion nicht kennt, denn die ist SQL Server spezifisch.

    Du könntest die CAST Funktion verwenden, die ist auch in ANSI-SQL definiert. Oder Du siehst Dich mal in der PostGreSQL Referenz um, was es so an Funktionen gibt http://postgis.net/docs/manual-1.5/reference.html

    Ich würde es zunächst mit ST_AsText versuchen.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 4. Februar 2016 11:44
  • Gute Morgen,

    Mit ST_AsText habe ich es auch versucht...

    SELECT * FROM OPENQUERY([LOCAL POSTGRESQL], 'SELECT geom.STAsText() from [postgis].[public].[kg]') AS Qry

    SELECT geom
    FROM OPENQUERY([LOCAL POSTGRESQL],
                   'SELECT ST_AsText(geom) from [postgis].[public].[kg]') AS Qry

    Leider bekomme ich wieder die gleichen Fehlermeldungen...

    Freitag, 5. Februar 2016 08:35
  • Hallo,

    probiere mal, ob ein zusätzlicher expliziter CAST auf VARCHAR(8000) den Fehler verschwinden lässt. Ausserdem solltest Du der Spalte einen Namen geben, siehe

    http://stackoverflow.com/questions/28739011/mssql-linked-server-supplied-inconsistent-metadata-for-a-column

    Generell scheint der (ODBC-)Treiber etwas wackelig... hast du den aktuellsten installiert?

    Gruß Elmar

    Freitag, 5. Februar 2016 11:33
    Beantworter
  • Hallo,

    Mit Cast hat es leider auch nicht funktioniert...

    Ja meiner meinung nach schon, ich habe ihn mit dem Stack Builder mitinstalliert.

    Liebe Grüße Stefan!

    Freitag, 5. Februar 2016 13:53
  • Hallo ITS_StefanNarrenhofer,

    bist Du hier weitergekommen?

    Gruß

    Aleksander


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht,  kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 1. März 2016 09:39
  • Hallo,
    Nein leider nicht...

    Dienstag, 1. März 2016 14:32