Fehlersuche mit TSQL
Harlequin
- datenbank
Yerf!
Ich steh grad vor nem Problem und weis nicht, wie ich das am einfchsten lösen kann.
Ich hab einen MS SQL 2003 Server in den ich ein XML importieren will. Das ganze läuft über eine Stored Procedure. Leider bekomm ich dabei einen Fehler (es wird versucht Null einzutragen, wo keines erlaubt ist). Nur wie finde ich jetzt innerhalb meiner XML (ca. 28MB) den fehlerhaften Datensatz?
Mit dem Editor war ich bisher auch nicht erfolgreich, ein leeres Element ist es jedenfalls nicht...
Gibts eine Möglichkeit das mitprotokolieren zu lassen oder den Fehler abzufangen und dann die Werte die versucht werden einzutragen auszugeben? Momentan setz ich das Statement über das management Studio ab.
Der betreffende teil aus der Procedure (da sind dann noch mehr statemnts drin, aber der schlägt fehl, weil bei ID null eingetragen werden soll.
INSERT INTO dbo.IDProducer
(ID, OnBehalfOf, ProducedDate)
SELECT ID = M.Item.value('(ID/text())[1]', 'int'),
OnBehalfOf = M.Item.value('(ID/text())[1]', 'int'),
ProducedDate = '21.02.2011'
FROM @ImportData.nodes('Measures/Measure') AS M(Item);
Wie kann ich da mitbekommen wo der Fehler ist? Ideal wäre eine Auflistung aller Einträge die vorher abgearbeitet werden sollen.
Ich hab jetzt mal die Transaction um das Statement auskommentiert, damit kein Rollback stattfindet. Leider ist die tabelle danach trotzdem leer, ich seh also nicht, wie weit er gekommen ist, biss der Bull auftrat...
Wie find ich den blöden Wert?
Gruß,
Harlequin
INSERT INTO dbo.IDProducer
(ID, OnBehalfOf, ProducedDate) SELECT ID = M.Item.value('(ID/text())[1]', 'int'), OnBehalfOf = M.Item.value('(ID/text())[1]', 'int'), ProducedDate = '21.02.2011' FROM @ImportData.nodes('Measures/Measure') AS M(Item);
>
Wenn die entspr. Spalte keine Identity-Spalte ist, könntest du mit COALESCE() arbeiten, die Sätze werden zwar eingetragen, lassen sich aber danach filtern.
~~~sql
(ID, OnBehalfOf, ProducedDate)
SELECT ID = COALESCE(M.Item.value('(ID/text())[1]', 'int'), 0),
Yerf!
Wenn die entspr. Spalte keine Identity-Spalte ist, könntest du mit COALESCE() arbeiten, die Sätze werden zwar eingetragen, lassen sich aber danach filtern.
Ist keine Identity-Spalte (hört sich nur so an, weil ich den Namen gekürzt hab...), das würde also gehen. Wobei mir dabei aber grad noch ne viel blödere Idee kommt... ich könnt ja einfach nur den inneren Select mal isoliert laufen lassen, dann seh ich ja, was er versucht einzufügen.
Manchmal muss man das Thema einfach nur mit anderen diskutieren, dann kommt man selber auf eine Lösung ;-)
Danke und Gruß,
Harlequin
Yerf!
Hmpf... nächstes Problem. Der Select bricht mir mit seltsamen Fehlermeldungen (Syntaxerror near 'FROM') oder Out of Memory-Meldungen ab.
Kann es sein, das 28MB an XML-Daten zu viel für ein Statement sind?
Gruß,
Harlequin
Yerf!
Kann es sein, das 28MB an XML-Daten zu viel für ein Statement sind?
...scheint so. Mit kleineren Häppchen gehts und ich konnte inzwischen auch die kaputten Datensätze finden.
Gruß,
Harlequin
Moin Moin!
Ich hab einen MS SQL 2003 Server in den ich ein XML importieren will. Das ganze läuft über eine Stored Procedure.
Herzliches Beileid. ;-)
Leider bekomm ich dabei einen Fehler (es wird versucht Null einzutragen, wo keines erlaubt ist). Nur wie finde ich jetzt innerhalb meiner XML (ca. 28MB) den fehlerhaften Datensatz?
Wenn ich nicht völlig verkalkt bin, hat der SQL Server irgendwo eine Funktion mit einem nicht ganz intuitiven Namen (RAISERROR?), um ein Log bzw. Debug-Infos zu schreiben, entweder in eine Datei auf dem Server oder zurück zum Client.
Füge also reichlich printf-Equivalente in die Stored Procedure ein.
Wenn alle Stricke reißen, bau Dir eine Hilfstabelle (id int identity, logmsg text), in die Du per insert Log-Einträge schreibst.
Ach ja, Mails kann der SQL-Server auch verschicken. Wenn Du also lokal einen willigen Mailserver hast, kannst Du auch per E-Mail debuggen ... ;-)
Alexander
Yerf!
Herzliches Beileid. ;-)
Och... bis zur jetzigen Stelle liefs eigentlich ganz gut ;-)
Beispieldaten hab ich jedenfalls schon erfolgreich importiert, aber mit dem "echten" Datensatz gibts jetzt probleme...
Leider bekomm ich dabei einen Fehler (es wird versucht Null einzutragen, wo keines erlaubt ist). Nur wie finde ich jetzt innerhalb meiner XML (ca. 28MB) den fehlerhaften Datensatz?
Wenn ich nicht völlig verkalkt bin, hat der SQL Server irgendwo eine Funktion mit einem nicht ganz intuitiven Namen (RAISERROR?), um ein Log bzw. Debug-Infos zu schreiben, entweder in eine Datei auf dem Server oder zurück zum Client.
Füge also reichlich printf-Equivalente in die Stored Procedure ein.
Mit Prints bekomm ich zwar ausgaben hin, aber nur zwischen den Statements. Leider bricht er ja innerhalb eines Inserts ab, der mehrere tausend Datensätze schreibt. Ich bräuchte also einen Print, der für jeden Datensatz beim Insert eine Ausgabe macht. Aber der Tipp von DiBo33 ist da nicht schlecht.
Gruß,
Harlequin