SQL Server: Konvertieren von VARCHAR nach INT
Komme ich nicht weiter über das konvertieren von varchar
Spalte UserID
zu INT
. Ich weiß, bitte nicht Fragen, warum diese UserID
Spalte wurde nicht erstellt, da INT zunächst lange Geschichte.
So, ich habe versucht, aber es funktioniert nicht. und geben mir eine Fehlermeldung:
select CAST(userID AS int) from audit
Fehler:
Fehler bei der Konvertierung beim konvertieren den varchar-Wert
'1581............................................................................................................................' in den int-Datentyp.
Habe ich select len(userID) from audit
und es gibt 128 Zeichen, die keine Leerzeichen.
Versuchte ich zu erkennen, ASCII-Zeichen für diejenigen, trailing, nachdem die ID-Nummer und ASCII-Wert = 0.
Aktualisiert!!!
Habe ich auch schon versucht LTRIM
RTRIM
und ersetzen char(0)
mit ''
aber funktioniert nicht.
Der einzige Weg, es funktioniert, wenn ich sagen, die Feste Anzahl von Zeichen wie dieses unten, aber UserID
ist nicht immer 4 Zeichen.
select CAST(LEFT(userID, 4) AS int) from audit
Dank,
InformationsquelleAutor der Frage Milacay | 2013-04-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie versuchen, die Tabelle zu aktualisieren, um loszuwerden, diese Zeichen:
Aber dann werden Sie auch brauchen, um zu beheben, was ist, indem diese fehlerhaften Daten in der Tabelle in den ersten Platz. In der Zwischenzeit vielleicht versuchen:
Aber das ist nicht eine langfristige Lösung. Fix die Daten (und die Daten geben, während du dabei bist). Wenn Sie nicht beheben können, wird der Datentyp sofort, dann kann man schnell den Schuldigen finden, indem Sie hinzufügen einer check-Einschränkung:
BEARBEITEN
Ok, das ist definitiv eine 4-stellige Zahl, gefolgt von sechs Instanzen von CHAR(0). Und der workaround, die ich geschrieben funktioniert auf jeden Fall für mich:
Bestätigen Sie bitte, dass dieser code auf seine eigene (gut, die ersten
SELECT
sowieso), die für Sie arbeitet. Wenn es dann funktioniert, die Fehlermeldung, die Sie erhalten, von einem anderen nicht-numerisches Zeichen in eine andere Zeile (und wenn nicht dann haben Sie vielleicht ein zu bauen, wo sich ein bestimmter Fehler noch nicht behoben wurde). Um zu versuchen und einzugrenzen können Sie nehmen zufällige Werte aus der folgenden Abfrage und dann eine Schleife durch die Zeichen:So nehmen Sie eine zufällige Zeile, und fügen Sie die Ausgabe in eine Abfrage wie diese:
Dies kann einige Versuch und Irrtum, bevor Sie auf eine Zeile, die fehlschlägt, die aus anderen Gründen als
CHAR(0)
- da kann man nicht wirklich herausfiltern, die ZeilenCHAR(0)
denn Sie enthalten könnteCHAR(0)
undCHAR(something else)
. Für alle wir wissen, Sie haben Werte in der Tabelle wie:...das kann auch nicht in eine Ganzzahl konvertiert, ob Sie ausgetauscht habe
CHAR(0)
oder nicht.Ich weiß, Sie wollen nicht, es zu hören, aber ich bin wirklich froh, das ist schmerzhaft für den Menschen, denn jetzt haben Sie Krieg mehr Geschichten zurück zu drängen, wenn die Leute zu sehr schlechten Entscheidungen, die zu Datentypen.
InformationsquelleAutor der Antwort Aaron Bertrand
Diese Frage hat 91,000 Aussicht so vielleicht viele Menschen sind auf der Suche nach einer generischen Lösung auf die Frage im Titel "Fehler beim konvertieren von varchar zu INT"
Wenn Sie auf SQL Server 2012+ eine Möglichkeit der Behandlung dieser ungültigen Daten ist die Verwendung
TRY_CAST
Auf früheren Versionen, die Sie nutzen könnten
Beide zurück
NULL
wenn der Wert nicht Stimmen.In dem speziellen Fall, dass Sie in Ihrer Frage mit bekannt schlechten Werte würde ich die folgenden aber.
Versuchen, ersetzen Sie die null-Zeichen ist oft problematisch, außer, wenn mit einer binären Sortierung.
InformationsquelleAutor der Antwort Martin Smith
Dies ist mehr für jemanden, der Suche nach einem Ergebnis, als die ursprüngliche post-er. Dieser arbeitete für mich...
InformationsquelleAutor der Antwort Eric Brueggemann
Ich würde versuchen triming die Anzahl zu sehen, was Sie bekommen:
wenn das den richtigen Wert zurück dann nur:
wenn das nicht den richtigen Wert zurück, dann würde ich tun, ersetzen, entfernen Sie den leeren Raum:
InformationsquelleAutor der Antwort Avitus