Fragensteller
Linked Server für PostgreSQL/PostGIS

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
Ich hoffe ihr könnt mir weiterhelfen.
https://www.mssqltips.com/sqlservertip/3662/sql-server-and-postgresql-linked-server-configuration--part-2/
- Typ geändert Aleksander Chalabashiev Freitag, 4. März 2016 08:31 keine bestätige Lösung
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] -
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
-
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?
-
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] -
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?
-
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] -
Gute Morgen,
Mit ST_AsText habe ich es auch versucht...
Leider bekomme ich wieder die gleichen Fehlermeldungen...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
-
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
Generell scheint der (ODBC-)Treiber etwas wackelig... hast du den aktuellsten installiert?
Gruß Elmar
-
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.