Konvertierungsfehler bei merge Anweisung

Zehbart

Benutzer
Beiträge
5
Guten Morgen,
ich komme bei einer Fehlermeldung einfach nicht weiter, vielleicht hat jemand von euch ja eine Idee.

Es gibt zwei Tabellen, dbo.Packlisten und dbo.TempPacklisten. Mit der gespeicherten Prozedur dbo.MergePacklisten werden die Daten aus der Tabelle dbo.TempPacklisten mit der Tabelle dbo.Packlisten abgeglichen, dh. neue Daten in dbo.Packlisten eingefügt und bestehende Daten bei Bedarf aktualisiert. Gelöscht wird aus dbo.Packlisten nie etwas.

Die Prozedur hat immer fleißig ihren Dienst getan, bis ich die Spalte "MengeGeplantInEinheit" nachträglich hinzugefügt habe. Vom Aufbau her ist diese Spalte identisch zu der Spalte "MengeGeplantKisten". Dennoch erhalte ich beim Ausführen der Prozedur folgende Fehlermeldung:

Nachricht 8114, Stufe 16, Status 5, Prozedur dbo.MergePacklisten, Zeile 5 [Batchstartzeile 2]
Fehler beim Konvertieren des varchar-Datentyps in numeric.

Ich verstehe nicht, warum von einem varchar Datentyp gesprochen wird, wo doch in der Spalte nur decimal vorhanden ist. Der Fehler tritt auch auf, wenn ich testweise manuell Daten dbo.TempPacklisten eintrage.
Was mir aufgefallen ist: Das Einfügen funktioniert reibungslos. Solange dbo.Packlisten komplett leer ist, kann ich die Funktion problemlos durchlaufen lassen und die Werte werden übertragen. Erst wenn ich die Funktion starte und Werte in dbo.Packlisten aktualisiert werden müssen erscheint die Fehlermeldung.

Hier der Aufbau der beiden Tabellen - er ist bei dbo.Packlisten und dbo.TempPacklisten identisch:

upload_2021-5-17_9-5-53.png

Hier die gespeicherte Prozedur dbo.MergePacklisten:

set NOCOUNT on

MERGE dbo.Packlisten AS Trgt
USING dbo.Temp_Packlisten Src
ON Trgt.ID = Src.ID

WHEN NOT MATCHED BY TARGET THEN
INSERT (ID, VerkaufsstellenID, MarktDatum, PLU, MengeGeplantKisten, MengeGeplantInEinheit, KommentarMarktTeam, KommentarKommissionierung, Rolli, PositionErstellt, PositionGepackt)
VALUES (ID, VerkaufsstellenID, MarktDatum, PLU, MengeGeplantKisten, MengeGeplantInEinheit, KommentarMarktTeam, KommentarKommissionierung, Rolli, PositionErstellt, PositionGepackt)

WHEN MATCHED AND
(
ISNULL(Trgt.ID, '') <> ISNULL(Src.ID, '')
OR
ISNULL(Trgt.VerkaufsstellenID, '') <> ISNULL(Src.VerkaufsstellenID, '')
OR
ISNULL(Trgt.MarktDatum, '') <> ISNULL(Src.MarktDatum, '')
OR
ISNULL(Trgt.PLU, '') <> ISNULL(Src.PLU, '')
OR
ISNULL(Trgt.MengeGeplantInEinheit, '') <> ISNULL(Src.MengeGeplantInEinheit, '')
OR
ISNULL(Trgt.MengeGeplantKisten, '') <> ISNULL(Src.MengeGeplantKisten, '')
OR
ISNULL(Trgt.KommentarMarktTeam, '') <> ISNULL(Src.KommentarMarktTeam, '')
OR
ISNULL(Trgt.KommentarKommissionierung, '') <> ISNULL(Src.KommentarKommissionierung, '')
OR
ISNULL(Trgt.Rolli, '') <> ISNULL(Src.Rolli, '')
OR
ISNULL(Trgt.PositionErstellt, '') <> ISNULL(Src.PositionErstellt, '')
OR
ISNULL(Trgt.PositionGepackt, '') <> ISNULL(Src.PositionGepackt, '')
)

THEN

UPDATE SET
ID = Src.ID,
VerkaufsstellenID = Src.VerkaufsstellenID,
MarktDatum=Src.MarktDatum,
PLU=Src.PLU,
MengeGeplantKisten=Src.MengeGeplantKisten,
MengeGeplantInEinheit=Src.MengeGeplantInEinheit,
KommentarMarktTeam=Src.KommentarMarktTeam,
KommentarKommissionierung=Src.KommentarKommissionierung,
Rolli=Src.Rolli,
PositionErstellt=Src.PositionErstellt,
PositionGepackt=Src.PositionGepackt;



Zum Abschluss hier noch ein Datenbeispiel aus dbo.TempPacklisten:

upload_2021-5-17_9-8-59.png


Hat jemand eine Idee, wie der Fehler zustande kommt? Ich zerbreche mir seit Stunden den Kopf und probiere alles mögliche aus - leider bisher ohne Erfolg...
 
Werbung:
Die Prüfung mit isnull in der Where Condition ist etwas schräg.

Du setzt die isNull Prüfung offenbar nicht Typ äquivalent ein, was m.E. ideal wäre. Und offenbar auch nicht mal implizit konvertierbar, wie es die Doku möchte.
Abgesehen davon zeigst Du zwar eine Temp Table Definition, wo netterweise die fraglichen Spalten auf "not null" stehen und die Prüfung unnötig wäre, nicht jedoch die Definition der Zieltabelle. Das macht eine brauchbare Aussage zum Problem etwas schwierig.

Hier die Doku:
Syntax
syntaxsql
ISNULL ( check_expression , replacement_value )
Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 oder früher finden Sie unter Dokumentation zu früheren Versionen.

Argumente
check_expression
Dies ist der Ausdruck, der auf NULL überprüft werden soll. check_expression kann ein beliebiger Typ sein.

replacement_value
Der Ausdruck, der zurückgegeben werden soll, wenn Prüfausdruck NULL ist. replacement_value muss einen Typ aufweisen, der implizit in den Typ von check_expression konvertiert werden kann.
 
Besten Dank für die Antwort. Die Definition der Zieltabelle ist identisch zu der Definition der Source Tabelle.

Hier noch einmal beide im Vergleich:

dbo.TempPacklisten:
upload_2021-5-17_10-40-46.png

Pdbo.acklisten:
upload_2021-5-17_10-42-9.png

Ich werde mich mal mit der ISNULL Anweisung beschäftigen. Danke für den Hinweis.
 

Anhänge

  • upload_2021-5-17_10-40-34.png
    upload_2021-5-17_10-40-34.png
    37,9 KB · Aufrufe: 1
Wenn man gezwungen ist, NULL Werte zu prüfen, würde man nicht konvertieren, sondern mit "<feld> is null" oder "<feld> is not null" arbeiten.
Das kann zu recht langen kriterien führen, besonders wenn auch noch Kombinationen berücksichtigt werden müssen. Aber die Eigenheiten von NULL führen leider zwangsläufig zu diesem Vorgehen.
Daher ist es naheliegend, wo möglich diesen Fall auszuschließen. Eine Cloumn Definition, die NULL Werte gar nicht erst erlaubt, muss darauf auch nicht geprüft werden, wenn es um existierende Datensätze geht.
In Deinem Fall wandelst Du Nichts (NULL) entweder zu Leertext ('') oder erhältst den Originalwert und Typ. Durch die eingesetzte Funktion isnull(), ihr Verhalten und die vorhersehbare, mögliche Typ-Diskrepanz zwischen Ausgangwert vom Typ Numeric und fallweisem Konversionsergebnis vom Typ Text, handelst Du Dir dann Probleme ein.
 
Werbung:
Es hat tatsächlich an der ISTNULL Anweisung gelegen - vielen Dank für die richtige Spur! Jetzt läuft alles wie gewollt. Habe die Merge Prozedur wie folgt geändert:


....
ISNULL(Trgt.VerkaufsstellenID, '') <> ISNULL(Src.VerkaufsstellenID, '')
OR
ISNULL(Trgt.MarktDatum, '') <> ISNULL(Src.MarktDatum, '')
OR
ISNULL(Trgt.PLU, '') <> ISNULL(Src.PLU, '')
OR
ISNULL(Trgt.MengeGeplantInEinheit, 0.0) <> ISNULL(Src.MengeGeplantInEinheit, 0.0)
OR
ISNULL(Trgt.MengeGeplantKisten, 0.0) <> ISNULL(Src.MengeGeplantKisten, 0.0)
OR
ISNULL(Trgt.KommentarMarktTeam, '') <> ISNULL(Src.KommentarMarktTeam, '')
OR
ISNULL(Trgt.KommentarKommissionierung, '') <> ISNULL(Src.KommentarKommissionierung, '')
OR
ISNULL(Trgt.Rolli, '') <> ISNULL(Src.Rolli, '')
.....


Besten Dank für die Hilfe.
 
Zurück
Oben