none
Zugriff auf Tabellen einer MySQL DB mittels ODBC RRS feed

  • Frage

  • Hallo zusammen,

    hätte nie gedacht, dass es so ein Problem werden könnte...

    Aufgabenstellung ist Daten aus einer MySQL DB auszulesen und in eine MS 2012 DB zu importieren, regelmäßige Reports erstellen zu können.

    Installiert ist der aktuelle 64 Bit ODBC Treiber von MySQL 5.3.9.

    Mit Hilfe dieses ODBC Treibers habe ich einen Linked Server eingerichtet und kann lesend auf die Tabellen zugreifen.

    Um Daten abrufen zu können, funktioniert es nur mit folgendem Code:

    exec ('select spalte1, spalte2, spalte3 from Datenbank.Tabelle') at LinkedServername

    Führe ich den Select aus, erhalte ich den gesamte Inhalt der Tabelle.

    Möchte ich allerdings die Daten in eine Tabelle auf unserem MS Sqlserver einfügen, so schlägt das fehl:

    insert MSSQLServer.dbo.Datenbank (spalte1, spalte2, spalte3)
    exec ('select spalte1, spalte2, spalte3 from Datenbank.Tabelle') at LinkedServername

    Die Fehlermeldung lautet:

    Der OLE DB-Anbieter 'MSDASQL' für den Verbindungsserver 'LinkedServername' hat die Meldung '[MySQL][ODBC 5.2(a) Driver]Optional feature not supported' zurückgeben.
    Msg 7391, Level 16, State 2, Line 1
    Der Vorgang konnte nicht ausgeführt werden, da der OLE DB-Anbieter 'MSDASQL' für den Verbindungsserver 'LinkedServername' keine verteilte Transaktion beginnen konnte.

    Verteilte Transaktionen können wir auf dem Fremdserver (MySQL) nicht konfigurieren. Dort haben wir keinen zugriff.

    Die Zugriffssyntax schlägt komplett fehl

    select spalte1, spalte2, spalte3 from LinkedServername.Datenbank..Tabelle

    Hat jemand von euch eine Idee wie wir die Daten in unseren Server regelmäßig importieren / aktualisieren können?

    Vielen Dank im Voraus

    Dirk


    Montag, 13. November 2017 15:43

Antworten

Alle Antworten

  • Hallo Dirk, 
    nichts ist so leicht wie es aussieht ( naja fast).

    Ohne das Du eine SQL absetzten kannst ohne das Exec wird das kaum funktionieren.
    Schau mal ob diese Beschreibung Dir hilft: 
    https://stackoverflow.com/questions/5945435/sql-server-2000-linked-server/6651704#6651704
    Das ist zwar schon älter sollte aber wenn ich mich recht entsinne passen.
    HTH

    Grüße Alexander

    Montag, 13. November 2017 16:06
  • An Stelle des Exec kannst du 2 Varianten verwenden:

    Select * from [Verbindungsserver].[Datenbank].[Schema].[Tabelle]
    Select * from [Verbindungsserver].[Schema].[Tabelle]

    Alternativ geht ebenso

    select * from OpenQuery('Verbindungsserver', 'Select * from Table')

    Der Openquery funktioniert meist besser, da man hier explizit auf die Syntax des Zielservers eingehen kann.

    Somit kannst du nun einen Insert durchführen:
    insert into mylocaltable
    select * from Openquery(....)

    Montag, 13. November 2017 16:13
  • Hallo

    vielen Dank für die Antwort

    Leider hat diese MySQL DB kein Schema... Kann also auch keins eintragen. In einem anderen Projekt mit einer Oracle DB konnte man einfach ein leeres Schema (also Datenbank..Tabelle) eintragen und ich bekam Daten.

    In diesem Fall resultiert es leider nur in dem oben beschriebenen Fehler.

    Schönen Gruß

    Dirk

    Montag, 13. November 2017 16:38
  • Hallo Alexander

    vielen Dank für die schnelle Antwort.

    Mit den Einstellungen habe ich gespielt, leider ohne Erfolg.

    Ich probiere Deine Empfohlenen Einstellungen nochmal aus.

    Werde die Verbindung nochmal neu bauen und erneut testen..

    Ist schon merkwürdig dass es mit MySQL nicht will während andere DBs da doch einfacher zur verbinden sind.

    Montag, 13. November 2017 16:41
  • Hast du es denn mal mit dem Openquery() versucht?
    • Als Antwort markiert DirkG Montag, 13. November 2017 16:49
    Montag, 13. November 2017 16:43
  • Perfekt!

    Es klappt.

    Ich danke Dir.

    Man ist einfach zu verblendet, wenn man es bisher immer auf andere Art gelöstt hat.

    openquery ist die Lösung.

    Schönen Gußr

    Dirk

    Montag, 13. November 2017 16:49
  • Zur Erklärung sei dazu noch folgendes gesagt:

    Jede DB bringt mitunter ihre eigenen Dialekte mit.
    Macht man einen "Select * from Verbindung.X.Y.Z" geht der SQL-Server eben davon aus, dass der Dialekt kompatibel ist. Dies ist aber nur bei anderen SQL-Servern und ggf. MS-Access der Fall.

    Der Hauptpunkt sind da nicht mal die skalaren Funktionen, die bei "Select *" ja keine Rolle spielen, sondern die Benamung von Feldern und Tabellen/Views.
    Im SQL-Server werden casesensitive Namen in eckige Klammern gestellt, im SQL-Standard und vielen anderen Datenbanken in Anführungszeichen."

    Select * from Verbindung.X.Y.Z wird dann intern aufgelöst in:

    select * from Openquery('Verbindung', 'select [Feld1], [Feld2], ... from [MyTable]')

    Und wenn das Ziel diese Syntax nicht versteht klappt es halt nicht.
    Im Openquery hat man dann alles selber in der Hand und kann auf die Syntax und Möglichkeiten entsprechend eingehen.

    Die Exec-Anweisung dient i.d.R. auch eher zum Ausführen von Prozeduren, die auch Resultsets zurückgeben können.

    PS:
    Ein Openquery() lässt sich i.Ü. auch in einer View verstecken, so dass auf die View wieder mit den SQL-Server-methoden zugegriffen werden kann.
    Ebenso kann man dann mit Instead-Of-Triggern aus dieser View direkt wieder Daten an den Verbindungsserver übertragen.

    Dienstag, 14. November 2017 11:16
  • Vielen Dank für die Erklärung.

    wir haben einige andere Verbindungen im Einsatz z.B. Informix (auch über ODBC), welche direkt abzufragen sind: also einfach

    select feld1, feld2 from verbindungsserver.dbname.schema.tabelle

    daher war ich verwundert, dass das bei der MySql nicht funktionieren wollte.

    Dort funktioniert das auch mit joins auf lokale Tabellen usw.

    Werden also openquery weiter im Auge behalten gerade im Einsatz mit Austausch mit anderen Systemen.

    Nachmals besten Dank für die Unterstützung.

    Dirk

    Dienstag, 14. November 2017 12:11