Fehlermeldung bei einer INSERT-Anweisung ...

18/09/2008 - 11:17 von Nicolas Nickisch | Report spam
Wie man an untenstehendem Code sehen kann, soll das Ergebnis einer
SELECT-ANweisung in die Tabelle Kontobuch geschrieben werden.

Kanckpunkt scheint gleich die erste Spalte zu sein.

In 'Kontobuch' ist dies ein Primàrschlüssel, der automatisch geneiert wird.

Ich versuche nun, hier NULL zu übergeben, in der Hoffnung, das der SQL
selber die entsprechende Spalte belegt.

Nun bekomme ich aber die Fehlermeldung:

Meldung 257, Ebene 16, Status 3, Zeile 1

Die implizite Konvertierung vom datetime-Datentyp in int ist nicht zulàssig.
Verwenden Sie die CONVERT-Funktion, um diese Abfrage auszuführen.



Das deutet für mich darauf hin, dass der SQL eigentlich gar nicht die
Primàrschlüssel-Splate erwartet, sondern als ersten Parameter ein Datum wie
in der Spalte EintragAngelegt vorgesehen.

Lasse ich aber die Zeile NULL as DatensatzID weg, dann beschwert man sich,
dass die Anazhl der Spalten nicht übereinstimme.

Was kann/muss ich tun ?

insert into dbo.kontobuch

SELECT

null as DatensatzID,

{ fn NOW() } AS EintragAngelegt,

2 AS Eintragstyp,

KontoNr,

null as KontoverbindungNr,

null as AccountNumber,

[Differenz zum errechneten Kontostand] * - 1 AS Ausgleichsbetrag,

.



Gruss Nico
 

Lesen sie die antworten

#1 Elmar Boye
18/09/2008 - 11:35 | Warnen spam
Hallo Nicolas,

Nicolas Nickisch schrieb:
Wie man an untenstehendem Code sehen kann, soll das Ergebnis einer
SELECT-ANweisung in die Tabelle Kontobuch geschrieben werden.

Kanckpunkt scheint gleich die erste Spalte zu sein.

In 'Kontobuch' ist dies ein Primàrschlüssel, der automatisch geneiert wird.

Ich versuche nun, hier NULL zu übergeben, in der Hoffnung, das der SQL
selber die entsprechende Spalte belegt.



Für Identitàtsspalten gibt es keine Vorgaben, es funktioniert also
weder DEFAULT noch NULL. Ausnahme wàre IDENTITY_INSERT.

Die implizite Konvertierung vom datetime-Datentyp in int ist nicht zulàssig.
Verwenden Sie die CONVERT-Funktion, um diese Abfrage auszuführen.

Das deutet für mich darauf hin, dass der SQL eigentlich gar nicht die
Primàrschlüssel-Splate erwartet, sondern als ersten Parameter ein Datum wie
in der Spalte EintragAngelegt vorgesehen.



Deine angenommene Reihenfolge dürfte schlicht und einfach falsch sein.

Was kann/muss ich tun ?



Gib eine Spaltenliste an.
Dort kannst Du zum einen die Identitàtsspalte (oder andere Spalten mit
Vorgaben weglassen - in Deinem Beispiel könnte EintragAngelegt mit einem
DEFAULT(GETDATE()) versehen werden.

Zum anderen gibt es keine Verwechselungsgefahr.

insert into dbo.kontobuch
SELECT


Die Kurzfassung sollte man ausschließlich für Testcode verwenden.
Denn sonst besteht immer die Gefahr, dass sich die Spaltenanzahl
und/oder -reihenfolge àndert.
Und Deine Anwendung fàllt auf die Nase, wenn Du nicht alle
Anweisungen findest, die davon betroffen sind.
Mit einer Spaltenliste überlebt sie solange ohne Änderung, wie
keine Spalte gelöscht wird oder andere drastische Verànderungen
erfolgen.

Gruß Elmar

Ähnliche fragen