Fehler beim konvertieren von Datentyp varchar
Ich habe derzeit eine Tabelle mit einer Spalte als varchar
. Diese Spalte kann halten zahlen oder text. Bei bestimmten Abfragen, die ich behandeln Sie es wie ein bigint
Spalte (ich mache einen join zwischen ihm und einer Spalte in eine andere Tabelle bigint
)
Solange gab es nur zahlen in dieses Feld hatte keine Mühe, aber die minute, die noch eine Zeile text hatte und nicht zahlen in diesem Feld habe ich ein "Fehler beim konvertieren von Datentyp varchar
zu bigint
." - Fehler, auch wenn in der WHERE-Teil machte ich sicher, dass keines der Felder kam.
Um dieses Problem zu lösen, die ich erstellt eine Ansicht wie folgt:
SELECT TOP (100) PERCENT ID, CAST(MyCol AS bigint) AS MyCol
FROM MyTable
WHERE (isnumeric(MyCol) = 1)
Aber auch wenn die Ansicht zeigt nur die Zeilen mit numerischen Werten und wirft Mycol zu bigint bekomme ich noch einen Fehler beim konvertieren von Datentyp varchar in bigint, wenn Sie die folgende Abfrage ausführen:
SELECT * FROM MyView where mycol=1
Wenn dabei die Abfragen gegen die Ansicht, es sollte nicht mehr wissen, was hinten Los ist! es sollten einfach zwei bigint-Felder! (siehe die beigefügten Bild, auch mssql management studio zeigt die view-Felder als bigint)
Ja, ich weiß, aber das ganze system ist zu weit Fortgeschritten, um große Veränderungen, die jetzt
Folgenden link hat einige details dazu: sql-server-eigen-Problem-Fehler-converting-varchar-Datentyp bigint
InformationsquelleAutor adinas | 2009-08-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
OK. Ich schließlich erstellt eine Ansicht, die funktioniert:
Dank AdaTheDev und CodeByMoonlight. Ich habe Ihre zwei Antworten, um diese zu erhalten. (Danke an die anderen repliers natürlich auch)
Nun wenn ich das mache schließt sich mit anderen bigint-Spalten oder tun so etwas wie "SELECT * FROM MyView where mycol=1' es gibt das richtige Ergebnis ohne Fehler. Meine Vermutung ist, dass der CAST in der Abfrage selbst bewirkt, dass die Abfrage-Optimierer, um nicht auf die ursprüngliche Tabelle, wie Christian Hayter gesagt werden kann, was mit den anderen Ansichten
InformationsquelleAutor adinas
Im Idealfall, Sie wollen, um zu versuchen, um zu vermeiden, dass die Speicherung der Daten in dieser form - Wert wäre, die Spaltung der BIGINT-Daten in eine separate Spalte für Leistung und einfache Abfragen.
Jedoch können Sie eine VERKNÜPFUNG wie in diesem Beispiel. Beachten Sie, ich bin nicht mit ISNUMERIC (), um zu bestimmen, wenn Sie eine gültige BIGINT, weil das validieren würde falsche Werte, wodurch ein Fehler bei der Konvertierung (z.B. Dezimalzahlen).
Update:
Die einzige Möglichkeit, die ich finden kann, um es an die Arbeit für eine WHERE-Klausel für einen bestimmten integer-Wert, ohne dabei andere CAST() auf die angeblich bigint-Spalte in der where-Klausel zu, wird die Verwendung einer Benutzer-definierten Funktion:
Ich nicht wirklich glaube, das ist eine tolle Idee, Leistung klug, aber es ist eine Lösung
InformationsquelleAutor AdaTheDev
Zur Beantwortung Ihrer Frage bezüglich der Fehlermeldung: wenn Sie auf einen Blick name in einer anderen Abfrage (vorausgesetzt, es ist eine traditionelle Sichtweise, nicht eine materialisierte view), SQL Server effektiv ist ein makro Austausch der view-definition in der Konsum-Abfrage und führt dann das.
Der Vorteil dabei ist, dass der query Optimizer tun können, einen viel besseren job, wenn es sieht, die gesamte Abfrage an, anstatt die Optimierung der anzeigen GESONDERT als "black box".
Folge ist, dass, wenn ein Fehler Auftritt, Fehler-Beschreibungen Aussehen kann verwirrend sein, weil die execution engine ist der Zugriff auf die zugrunde liegenden Tabellen für die Daten, nicht die Sicht.
Ich bin mir nicht sicher, wie materialisierte sichten behandelt werden, aber ich könnte mir vorstellen, dass Sie behandelt werden wie Tabellen, da der view die Daten in der Datenbank gecached.
Having said, die, ich Stimme mit den vorherigen Antworten - sollten Sie wieder denken, Ihr Tisch-design und trennen den text und integer-Daten-Werte in separaten Spalten.
InformationsquelleAutor Christian Hayter
Versuchen, ändern Sie Ihre Ansicht zu diesem :
Welche version von SQL Server verwenden Sie? Ich habe versucht, dies in SQL2000 und ohne Probleme. Froh, dass Sie eine Lösung gefunden, trotzdem 🙂
InformationsquelleAutor MartW
Haben Sie versucht, zu konvertieren, andere Tabelle bigint-Feld in varchar? Für mich macht es Sinn, zu führen robuster Konvertierung... Es sollte keinen Einfluss auf Ihre Leistung zu viel, wenn varchar-Feld ist indiziert.
InformationsquelleAutor Regent
Erwägen, eine redundante bigint-Feld, halten Sie den integer-Wert von af MyCol.
Können Sie dann die neuen index-Feld zu beschleunigen, die mitmachen.
InformationsquelleAutor Jan B. Kjeldsen
Versuchen Sie es mit dieser:
Dies sollte funktionieren, da die inneren wählen Sie nur zurück, numerischen Werten und dem äußeren wählen kann, also konvertieren Sie alle Werte aus der ersten select-in ein numerisches. Es scheint, dass in Ihren eigenen SQL-code versucht zu casten, bevor die Ausführung der isnumeric-Funktion (vielleicht hat es etwas zu tun mit Optimierung).
InformationsquelleAutor Gertjan
Versuchen Sie die wählen Sie in 2 Stufen.
erstellen Sie zunächst eine Ansicht, wählt alle Spalten, in denen meine col ist numerisch.
Dann wählen Sie in dieser Ansicht zu, wo Sie cast-varchar-Feld.
Die andere Sache, die Sie betrachten könnte, ist Ihre Gestaltung von Tabellen zu entfernen, die Notwendigkeit für die Darsteller.
BEARBEITEN
InformationsquelleAutor Shiraz Bhaiji