2010-11-18 4 views
8

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

SELECT * FROM OPENQUERY(MYSQL, 'SHOW TABLES') 

funktionieren gut. B.

SELECT * FROM OPENQUERY(MYSQL, 'SELECT nr FROM letter') 

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

SELECT * FROM OPENQUERY(MYSQL, 'SELECT * FROM mytable') 

löst einen Fehler:

Msg 7347, Level 16, State 1, Line 6 OLE DB provider 'MSDASQL' for linked server 'MYSQL' returned data that does not match expected data length for column '[MSDASQL].let_nr'. The (maximum) expected data length is 40, while the returned data length is 0.

Wie kann ich die SELECT * Syntax Arbeit machen?

Antwort

11

Ich war das gleiche Problem für 4 Tage, aber endlich fand ich das Warum und wie es zu beheben.

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 geschieht, wenn Ihr Feld mit fester Länge eine kürzere Zeichenfolge als die maximale Länge hat, die der SQL Server von der ODBC erwartet.

Der Fix; 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 wird ohne Probleme funktionieren.

Bitte lassen Sie mich wissen, wenn dies behoben wurde.

Tarek Basta

+0

Hallo, Tarek. Vielen Dank für Ihre Antwort! Tatsächlich können die char() - Felder mit konstanter Länge ein Problem sein. Ich hatte Probleme mit Strings, die aus MySQL importiert wurden, wo sie scheinbar mit Nullen aufgefüllt würden. Ich kann das jetzt nicht überprüfen, werde aber heute oder morgen Ihre Lösung versuchen. Vielen Dank! –

+0

Auf der anderen Seite, mit dem folgenden: exec ('Select * Von meiner Tabelle') AT MYSQL wird die Daten angezeigt, aber Sie können nicht die Ausgabe beitreten oder aus wählen, außer wenn Sie eine temporäre Tabelle erstellen und exportieren Ausgabe zu ihm. Aus diesem Grund bevorzuge ich persönlich Openquery. –

+0

Ich habe gerade Ihre Lösung getestet und in der Tat konvertieren CHAR-Felder in VARCHAR macht den Fehler weg. Tausend Dank! –

1

fand ich dieses

"The problem is that one of the fields being returned is a blank or NULL CHAR field. To resolve this in the Mysql ODBC settings select the option "Pad CHAR to Full Length"

Blick auf die letzten Beitrag here

+0

Ich überprüfte die Option, neu gestartet SQL Server für ein gutes Maß, aber das Problem ist immer noch da. –

+0

Es ist unbrauchbar für mysql enum type. Ich benutze mysql ODBC 5.1 Treiber, MySQL Server 5.5, SQL Server 2005. –

+0

Das gleiche hier - es löst das Problem nicht. – Filip

7

den folgenden Befehl ausführen, bevor Abfragen zu helfen scheint:

DBCC TRACEON (8765)

Die Fehlermeldungen Geh weg und Anfragen scheinen gut zu funktionieren.

Ich bin mir nicht sicher, was es tut; Ich fand es hier: http://bugs.mysql.com/bug.php?id=46857

Seltsamerweise wird SQL Server instabil, reagiert nicht mehr auf Abfragen und schließlich stürzt mit gruselig aussehenden Dumps in den Protokollen ein paar Minuten nach mehreren Abfragen an den MySQL-Server. 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.

+0

Haben Sie eine neue Lösung gefunden? –

+2

DBCC TRACEON (8765) löste es für mich. Und auch keine Instabilitätsprobleme. –

+0

Probieren Sie es aus, es funktioniert super! – petric

1

Eine Alternative wäre die trim() Funktion in der SELECT-Anweisung innerhalb OPENQUERY zu verwenden sein. Der Nachteil ist, dass Sie jedes Feld einzeln auflisten müssen, aber ich habe eine Ansicht erstellt, die OPENQUERY aufruft und dann in der Ansicht * auswählt.

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

+0

Funktioniert wie ein Charme! – Filip

2

Was ich tat, zu beheben, da ich die Datenbankstruktur MySQL nicht ändern kann, ist nur eine Ansicht mit einer Ex-Besetzung erstellen: meine Ansicht von MSSQL in meinem verknüpften Server CAST(call_history.calltype AS CHAR(8)) AS Calltype, und auswählen.

Der hinter Grund ist, dass einige seltsamen Typen funktionieren nicht gut mit dem Verbindungsserver (in meinem Fall die MySQL Enum)

1

Hier ist eine beschissene Lösung kam ich mit, weil ich nicht in der Lage, den Datentyp zu ändern zu varchar, da der Datenbankadministrator für den MySQL-Server befürchtet, dass es Probleme mit seinen Skripten geben wird.

in meiner MySQL-Select-Abfrage Ich führe eine case-Anweisung die Zeichenlänge der Zeichenfolge überprüfen und fügen Sie ein Füllzeichen vor der Zeichenfolge "füllung" bis zum Maximum (in meinem Fall ein Char (6)) . dann streiche ich in der select-Anweisung der openquery den Charakter wieder aus.

Select replace(gradeid,'0','') as gradeid from openquery(LINKEDTOMYSQL, ' 
SELECT case when char_length(gradeid) = 0 then concat("000000", gradeID) 
when char_length(gradeID) = 1 then concat("00000", gradeID) 
when char_length(gradeID) = 2 then concat("0000", gradeID) 
when char_length(gradeID) = 3 then concat("000", gradeID) 
when char_length(gradeID) = 4 then concat("00", gradeID) 
when char_length(gradeID) = 5 then concat("0", gradeID) 
else gradeid end as gradeid 
FROM sometableofmine') 

es funktioniert, aber es ist wahrscheinlich langsamer ...

vielleicht können Sie eine MySQL-Funktion vornehmen, die die gleiche Logik, oder kommen mit einer eleganteren Lösung tun wird.

1

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

Statt ...

column_name 

... Verwendung ...

`column_name` 

Dadurch hilft die MySQL Query-Engine sollte der Spaltenname Zusammenstoß mit einem Schlüssel oder vorbehalten- . Wort *

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

SELECT `column1`, `column2`, ... FROM TABLE_NAME 

Beispiel für die normale Datentyp Spalten

SELECT * FROM OPENQUERY(MYSQL, 'SELECT `column1`, `column2`,...,`columnN` FROM mytable') 

Beispiel für ENUM-Datentyp Spalten

SELECT * FROM OPENQUERY(MYSQL, 'SELECT `column1`, trim(`column2`) `column2`, `column3`,...,`columnN` FROM mytable') 

* Für jene auf SQL Server verwendet wird, ist es die MySql äquivalente Wert von Einwickeln in eckige Klammern, [ und ].

+0

Dies liefert keine Antwort auf die Frage. Sie können [ähnliche Fragen suchen] (https://stackoverflow.com/search) oder auf die verwandten und verknüpften Fragen auf der rechten Seite der Seite verweisen, um eine Antwort zu finden. Wenn Sie eine verwandte, aber andere Frage haben, [stellen Sie eine neue Frage] (https://stackoverflow.com/questions/ask), und fügen Sie einen Link zu diesem ein, um den Kontext zu verdeutlichen. Siehe: [Stellen Sie Fragen, erhalten Sie Antworten, keine Ablenkungen] (https://stackoverflow.com/tour) – Sneha

+0

Wenn Sie eine neue Frage haben, fragen Sie sie bitte, indem Sie auf [Frage stellen] klicken (https://stackoverflow.com/ Fragen/Fragen). Fügen Sie einen Link zu dieser Frage hinzu, wenn es hilft, Kontext bereitzustellen. - [Aus Bewertung] (/ review/low-quality-posts/18875529) –

+0

Dies beantwortet nicht wirklich die Frage. Wenn Sie eine andere Frage haben, können Sie sie durch Klicken auf [Frage stellen] (https://stackoverflow.com/questions/ask) stellen. Sie können auch [Kopfgeld hinzufügen] (https://stackoverflow.com/help/privileges/set-bounties) hinzufügen, um mehr Aufmerksamkeit auf diese Frage zu lenken, sobald Sie genug [Reputation] haben (https://stackoverflow.com/help/ Whats-Reputation). - [Aus Bewertung] (/ review/low-quality-posts/18875529) –