Problem mit SELECT * in MySQL durch ODBC von Microsoft SQL Server

8

Ich habe einen MySQL-Server als Verbindungsserver in Microsoft SQL Server 2008. Für den Link verwende ich MySQL ODBC Connector Version 5.1.8. Beim Aufrufen von Abfragen mit OPENQUERY (der einzige Weg, den ich beim Ausführen von Abfragen gefunden habe) treten Probleme auf. Einfache Abfragen wie

%Vor%

funktioniert gut. Auswahl einzelner Spalten, z. B.

%Vor%

funktioniert auch gut, aber die SELECT * -Syntax funktioniert nicht. Die Abfrage:

%Vor%

löst einen Fehler aus:

  

Msg 7347, Ebene 16, Status 1, Zeile 6   OLE DB-Provider 'MSDASQL' für verlinkt   Server 'MYSQL' hat Daten zurückgegeben, die dies tun   entspricht nicht der erwarteten Datenlänge für   Spalte '[MSDASQL] .let_nr'. Das   (maximal) erwartete Datenlänge ist 40,   während die zurückgegebene Datenlänge 0 ist.

Wie kann ich die SELECT * Syntax arbeiten lassen?

    
Gintautas Miliauskas 18.11.2010, 14:46
quelle

7 Antworten

11

Ich habe das gleiche Problem für 4 Tage durchgemacht, aber schließlich habe ich das Warum und wie es zu beheben gefunden.

Dieses Problem ist aufgetreten, wenn Sie mySQL-Verbindungsserver abfragen und die Tabelle, die Sie abfragen, einen Datentyp char () hat ... Dies bedeutet feste Länge NOT varchar (). Dies passiert, wenn Ihr Feld fester Länge eine kürzere Zeichenfolge als die maximale Länge hat, die der SQL Server von der ODBC erwartet.

Die Lösung; gehe zum MySQL-Server und ändere den Datentyp in varchar () und belasse die Länge so wie sie ist ... Beispiel, char (10) ändere sie in varchar (10).

Dies funktioniert ohne Probleme.

Bitte lassen Sie mich wissen, ob dies behoben wurde.

Tarek Basta     

Tarek Basta 15.12.2010, 22:23
quelle
8

Ausführen des folgenden Befehls vor Abfragen scheint zu helfen:

DBCC TRACEON (8765)

Die Fehlermeldungen verschwinden und Abfragen scheinen gut zu funktionieren.

Ich bin mir nicht sicher, was es tut; Ich habe es hier gefunden: Ссылка

Seltsamerweise wird SQL Server instabil, reagiert nicht mehr auf Abfragen und stürzt schließlich wenige Minuten nach mehreren Abfragen auf dem MySQL-Server mit unheimlich aussehenden Dumps in den Protokollen ab. Ich bin mir nicht sicher, ob dies irgendetwas mit dem DBCC-Befehl zu tun hat, deshalb bin ich immer noch an anderen möglichen Lösungen für dieses Problem interessiert.

    
Gintautas Miliauskas 18.11.2010 15:14
quelle
2

Was ich getan habe, um dies zu beheben, da ich die MySQL-Datenbankstruktur nicht ändern kann, ist einfach eine Ansicht mit einem Cast zu erstellen: CAST(call_history.calltype AS CHAR(8)) AS Calltype , und wähle meine Ansicht von MSSQL in meinem Verbindungsserver.

Der Grund dafür ist, dass einige seltsame Typen nicht gut mit dem verbundenen Server funktionieren (in meinem Fall die MySQL-Enumeration)

    
Charles 23.01.2012 01:14
quelle
1

Ich habe das gefunden

  

"Das Problem ist, dass eines der Felder   zurückgegeben wird, ist ein leeres oder NULL CHAR   Feld. Um dies im Mysql zu lösen   ODBC Einstellungen wählen Sie die Option "Pad"   CHAR in voller Länge "

Sehen Sie sich den letzten Beitrag hier

an     
cristian 18.11.2010 14:53
quelle
1

Eine Alternative wäre, die Funktion trim () in Ihrer SELECT-Anweisung innerhalb von OPENQUERY zu verwenden. Der Nachteil ist, dass Sie jedes Feld einzeln auflisten müssen, aber was ich gemacht habe, war eine Ansicht zu erstellen, die OPENQUERY aufruft und dann per * in der Ansicht auswählen.

Nicht ideal, aber besser als Datentypen in Tabellen ändern!

    
winston 06.12.2011 20:39
quelle
1

Hier ist eine beschissene Lösung, die ich gefunden habe, weil ich den Datentyp nicht in varchar ändern kann, da der Datenbankadministrator für den MySQL-Server Angst hat, dass er Probleme mit seinen Skripten verursachen könnte.

in meiner MySQL-Select-Abfrage Ich führe eine case-Anweisung aus, überprüfe die Zeichenlänge der Zeichenkette und füge ein Füllzeichen vor der Zeichenkette "füllung" bis zum Maximum hinzu (in meinem Fall ein char (6)). dann streiche ich in der select-Anweisung der openquery das Zeichen aus.

%Vor%

es funktioniert, aber es ist wahrscheinlich langsamer ...

Vielleicht können Sie eine MySQL-Funktion erstellen, die dieselbe Logik oder eine elegantere Lösung verwendet.

    
Jbtatro 17.05.2013 23:58
quelle
1

Ich hatte das ähnliche Problem selbst, das ich gelöst habe, indem ich die Spaltennamen in einzelne 'Style-Anführungszeichen eingeschlossen habe.

Anstelle von ...

%Vor%

... benutze ...

%Vor%

Dies hilft der MySql-Abfrage-Engine, sollte der Spaltenname mit einem Schlüssel oder einem reservierten Wort kollidieren. *

Anstatt SELECT * FROM TABLE_NAME zu verwenden, versuchen Sie, alle Spaltennamen mit Anführungszeichen zu verwenden:

%Vor%

Beispiel für normale Datentypspalten

%Vor%

Beispiel für Spalten des ENUM-Datentyps

%Vor%

* Für diejenigen, die an Sql Server gewöhnt sind, ist es das MySql-Äquivalent, einen Wert in eckige Klammern zu schreiben, [ und ] .

    
Zafor Iqbal 20.02.2018 10:16
quelle

Tags und Links