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
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?
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 p>
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.
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)
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!
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.
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:
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 ]
.
Tags und Links sql-server mysql odbc