2016-07-15 8 views
-1

in Tabelle A Ich habe eine Char (1) -Spalte namens Flag, die Nullable ist. In Tabelle BI hat auch eine char (1) Spalte, die nicht-nullable und ist so will ich ISNULL verwenden koaleszieren oder CASE einen expliziten Wert für NULL-Werte zu setzen, bevor ich die Daten aus Tabelle A in Tabelle B INSERTSQL Server Char (1) Konvertierung

wie so:

OUTER APPLY (VALUES(COALESCE(A.flag,CAST('0' AS char(1))))) AS AP(flag) 

Das Problem ist, gibt SQL Server die folgende Fehlermeldung:

Lookup Error - SQL Server Database Error: Conversion failed when converting the varchar value 'X' to data type int.

Es gibt Zeilen mit dem Wert 'X' in der Tabelle A, aber warum versucht SQL Server zu konvertieren ein Zeichen (1) col in einen int? Wenn ich nur die SELECT-Anweisung (ohne die Einfügung) ausführe, erhalte ich den Fehler nicht.

Was ich bisher getan:

  • Ich habe die Anzahl und die richtige Reihenfolge der Spalten in der INSERT überprüft und die SELECT-Statement
  • ich überprüft haben, dass die ausgewählte Spalte und die einfügespalte sind Borth char (1)
  • I die COALESCE aus der SELECT-Klausel auf eine APPLY verschoben haben
  • ich habe hinzugefügt OPTION (Recompile)
  • Es gibt keine Trigger auf Insert-Tabelle B
  • Ich habe SET SHOWPLAN_XML ON drehte ich keine Konvertierung Wie Convert Datatype = "char" finden oder data-type = "int"
  • die Insert-Tabelle B Konvertieren
  • neu erstellt
  • Ich habe den Quellspaltennamen A.flag durch ein Literal ersetzt - Hier funktioniert der INSERT! Also muss es ein Problem mit der Flag-Spalte geben.

Irgendwelche Vorschläge? Danke

+0

Klingt wie es ist eigentlich ein anderes Feld, das den Fehler wirft. Gibt es int Felder auf Tabelle b? –

+0

Hallo Joe, ja da sind. Aber wenn ich das Flag-Feld durch ein Literal wie '-' ersetze, funktioniert die Einfügung. Also, die anderen Felder müssen in Ordnung sein. – CPMunich

+0

@CPMunich versuchen etwas anderes als - wie Ihr wörtliches. Es kann zu einem int als 0 konvertiert werden. Das heißt, '' select cast ('-' as int) 'wird 0 zurückgeben. Ich hasse es zu fragen, aber bist du sicher, dass die Spalte, in die du einfügen willst, ein' char (1) 'ist? – scsimon

Antwort

0

Ich habe herausgefunden, dass eine der Ansichten, die auf die Tabelle verweisen, eine indizierte Sicht ist. Die WHERE-Klausel in dieser indizierten Sicht war falsch. Dort war das Filterprädikat ein Int anstelle von char (1). Nach dem Einschalten funktioniert die Einfügung einwandfrei.