2 Stimmen

SQL Server: "Konvertierung fehlgeschlagen beim Konvertieren von Datetime aus Zeichenfolge."

Ich versuche, die Ergebnisse aus einer Ansicht in eine Tabelle zu kopieren, indem ich verwende:

insert into tableA 
  select * from viewB order by id;

Ich erhalte die Fehlermeldung -

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting datetime from character string.

Tabelle A und Ansicht B haben etwa 80 Felder. Es würde ewig dauern herauszufinden, welche möglicherweise nicht übereinstimmen. Wie kann ich schnell bestimmen, welches Feld den Fehler verursacht?

2voto

marc_s Punkte 701497

Dies würde Ihnen eine Liste aller Spalten in Ihrer TableA geben, die einen datumbezogenen Typ (DATE, DATETIME, DATETIME2, DATETIMEOFFSET usw.) haben:

SELECT *
FROM sys.columns
WHERE object_id = object_id('TableA')
AND system_type_id IN (40, 42, 43, 58, 61)
ORDER BY name

Sie könnten dies auf beiden Tabellen ausführen und sehen, ob Sie Unterschiede finden.

Oder Sie könnten dies auf beiden Tabellen ausführen - es wird Ihnen eine Liste von Spalten (Namen) und ihrem zugehörigen Datentyp geben:

SELECT
    c.NAME,
    t.name  
FROM sys.columns c
INNER JOIN sys.types t ON c.system_type_id = t.system_type_id
WHERE object_id = object_id('TableA')
ORDER BY c.name

Vielleicht sehen Sie eine Spalte in TableB, die vom Typ varchar ist und die einer Spalte vom Typ DATETIME in TableA zugeordnet wird, und finden so Ihren Übeltäter.

Marc

2voto

HLGEM Punkte 91543

Sie haben ungültige Daten in einem Ihrer Felder. Überprüfen Sie jedes der Felder, die Datumsangaben enthalten sollen, mit der Funktion isdate().

Wählen Sie idfield, mydatefield aus meinerTabelle, wo isdate(mydatefield) = 0

Sie werden die Datensätze sehen, die ungültige Datumsangaben enthalten. Dies ist einer der Gründe, warum es nie eine gute Idee ist, Daten als Zeichenfolge zu speichern.

1voto

Evernoob Punkte 5556

Sind sie hauptsächlich DATETIME-Felder? Es sieht so aus, als würde versucht, einen String in ein DATETIME zu stecken, also können Sie damit beginnen, sich die ersten davon anzusehen.

Sollte nicht allzu lange dauern.

0voto

Spence Punkte 27536

Als Debug-Möglichkeit möchten Sie möglicherweise die Select-Abfrage aus der Ansicht ausführen und dann in einem einzelnen INSERT-Statement in die TabelleA einfügen.

Dann wird ein Fehler ausgegeben, der angibt, welcher Spalte nicht eingefügt werden konnte. Nehmen wir an, Sie können dies manuell tun. Gibt es sonst noch eine Möglichkeit, zu vermeiden, dass eine Zeichenfolge als Ihr Datums- und Uhrzeitspalte fungiert?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X