2012-04-12 13 views
3

Ich versuche, eine Tabelle von MySQL zu migrieren openquery MSSQL verwenden, aber ich bekomme immer folgende Fehlermeldung:Weit varchar Feld Ursachen „Angeforderte Konvertierung wird nicht unterstützt“ Fehler mit MySQL mit Openquery verknüpften Server

OLE DB provider "MSDASQL" for linked server "MYSQL" returned message "Requested conversion is not supported.". 
Msg 7341, Level 16, State 2, Line 1 
Cannot get the current row value of column "[MSDASQL].description" from OLE DB provider "MSDASQL" for linked server "MYSQL". 

Die SQL-Abfrage ich versuche zu laufen:

insert into dbo.tickets (id, description, createdAt) 
select * from openquery(MYSQL, 'select * from mydb.tickets') 

Mit openquery ich schon ein paar Tische, aber diese eine Tricks mich kopiert haben.

Auf beiden Seiten von Datenbanken ist das Feld descriptionvarchar(8000). In MySql gibt es keine Zeile, in der die Beschreibung null ist und die längste Beschreibung nur 5031 Zeichen enthält.

Ich habe versucht, eine neue Ansicht in MySql mit der gleichen Datenstruktur, aber den gleichen Fehler zu bekommen. Ich kann nicht feststellen, welche Zeile ein ungültiges Beschreibungsfeld enthält, da die Tabelle mehr als 65000 Zeilen enthält.

Ich habe auch versucht, die Daten in eine SQL-Datei zu speichern, aber ich habe OutOfMemoryException in Management Studio. Die ausgelagerte SQL-Datei selbst ist ungefähr 60 MB groß.

Haben Sie Vorschläge oder andere Möglichkeiten, diese Daten zu migrieren?

Vielen Dank im Voraus!

+0

Verwenden Sie eine andere Version von MySQL OLE DB Provider. – JotaBe

+0

Ich hatte ähnliche Probleme mit FoxPro-Treibern, und es konnte nur gelöst werden, indem ich die beleidigende Reihe fand, und es auf der FoxPro Seite änderte (ich hatte Probleme mit dem Datum, die außerhalb des normalen Bereichs waren). Obwohl es zu schwer aussieht, können Sie es ziemlich schnell finden, wenn Sie versuchen, die Filterung nach Hälften zu filtern (von 65.000 -> 32.000 -> 16.000 -> 8.000 -> 4.000 -> 2.000 -> 1.000 -> 500 -> 250 -> 125 -> 62 -> bis 31 dauert nur 14 Schüsse). – JotaBe

+0

Thx Jungs! Es scheint, dass der Datentyp von Varchar in Text geändert wurde! – papaiatis

Antwort

4

Ich habe es geschafft, dieses Problem zu beheben, indem ich den Datentypen sowohl auf MySql- als auch auf MSSQL-Seite auf TEXT änderte.

+1

Sie verringern den Text-Datentyp in MSSQL - jetzt, da Ihre Daten quer durch Sie sind, sollten Sie den Spaltentyp wahrscheinlich zurück in varchar ändern, es sei denn, Sie möchten die Spalte erneut importieren. Siehe die Warnung [hier] (http: // msdn.microsoft.com/en-us/library/ms187993.aspx). – Bridge

+0

@Bridge Danke, dass Sie mich wissen lassen! :) – papaiatis

+0

Kein Problem - denken Sie daran, diese Antwort als die tatsächliche Antwort (wenn es Sie lässt) zu markieren, damit andere Leute wissen, dass es gelöst wurde. – Bridge

8

In meiner Prüfung fand ich, dass das Hinzufügen CAST(field as char(4000)) auch das Problem löste.

Ich habe folgend in einer MySQL 5.1 Datenbank:

create table tmp_patrick (summary_text varchar(4096)); 
insert into tmp_patrick values ('foo'); 

Wenn ich folgende auf SQL Server 2008 R2 SP1 (10.50.2500) ausgeführt, MySQL ODBC-Treiber 64-Bit, entweder Version 5.1 oder 5.2W:

select * from openquery(MYSQL, 'select summary_text from scratch.tmp_patrick') 

es erzeugt den Fehler:

OLE DB provider "MSDASQL" for linked server "MYSQL" returned message "Requested conversion is not supported.". 
Msg 7341, Level 16, State 2, Line 1 
Cannot get the current row value of column "[MSDASQL].summary_text" from OLE DB provider "MSDASQL" for linked server "MYSQL". 

aber wenn ich hinzufügen CAST:

select * from openquery(MYSQL, 'select CAST(summary_text as char(4000)) from scratch.tmp_patrick') 

dann funktioniert es. Casting nach Char (4001) wird fehlschlagen.

Es ist mir nicht klar, woher die Grenze von 4000 Zeichen kommt.

+0

Ich frage mich, ob die Grenze von 4000 Zeichen ist, weil SQL Server versucht, die Daten in 'NVARCHAR' zu konvertieren, das eine Grenze von 4000 Zeichen hat. Es könnte sich auch lohnen, einen Cast auf 'VARCHAR (MAX)' oder 'NVARCHAR (MAX)' zu versuchen; das könnte das Problem vermeiden, ohne die Daten zu reduzieren, aber ich habe keinen verlinkten MySQL-Server, um mit mir selbst zu testen ... –

+0

Das hat funktioniert .. Danke! – user3062459