2008-08-28 7 views
5

Dies ist eine SQL 2000-Datenbank, mit der ich arbeite.SQL 2000 'TRY CATCH like' Fehlerbehandlung

Ich habe, was ich eine Staging-Tabelle, die eine Rohdaten-Dump von Daten ist, nennen, so ist alles Ntext oder Nvarchar (255).

Ich brauche zu werfen/konvertieren alle diese Daten in die entsprechenden Datentypen (dh int, dezimal, nvarchar, etc.)

Die Art und Weise, ich würde dies tun war durch alle Datensätze iterieren ein mit While-Schleife und versuchen Sie eine CAST für jede Spalte in einem einzelnen Datensatz während jeder Iteration, nachdem ich einen bestimmten Datensatz besuche ich es als bearbeitet (Bit-Feld).

Aber wie kann ich den Fehler protokollieren, wenn/wenn es auftritt, aber die While-Schleife weitermachen.

Zuerst implementierte ich dies mit einem TRY CATCH in einer lokalen SQL 2005-Instanz (um das Projekt in Gang zu bringen) und alles funktionierte gut, aber ich erfuhr heute, dass die Entwickler-& Produktionsdatenbank, die die internationalen DBAs eingerichtet haben eine SQL 2000-Instanz, also muss ich mich anpassen.

BEARBEITEN: Ich verwende ein SSIS-Paket, um die Staging-Tabelle aufzufüllen. Ich sehe, dass ich jetzt dieses Paket erneut besuchen und eine Skriptkomponente implementieren muss, um die Konvertierungen zu handhaben. Danke Jungs

EDIT: Ich am tue dies auf einem datensatzweise, nicht ein Batch-Einsatz, so dass die Transaktion Idee scheint, wie es möglich wäre, aber ich bin nicht sicher, wie Fall @@ ERROR und ermöglichen, dass die gespeicherte Prozedur fortgesetzt wird.

EDIT: Ich mag Guy's approach, ich werde es auf diese Weise implementieren.

Antwort

2

Allgemeinen I „Schleife durch die Platte“ Lösungen nicht gefällt, wie sie langsam zu neigen und Sie am Ende eine Menge von benutzerdefinierten Code zu schreiben.

So ...

Je nachdem, wie viele Datensätze sind in der Staging-Tabelle, können Sie das Verfahren die Daten mit einer Reihe von SQL-Anweisungen schreiben, die die Spalten für Richtigkeit prüfen und alle Datensätze markieren, die den Test nicht bestehen.

heißt

UPDATE staging_table 
SET status_code = 'FAIL_TEST_1' 
WHERE status_code IS NULL 
AND ISDATE(ntext_column1) = 0; 

UPDATE staging_table 
SET status_code = 'FAIL_TEST_2' 
WHERE status_code IS NULL 
AND ISNUMERIC(ntext_column2) = 0; 

etc... 

Schließlich

INSERT INTO results_table (mydate, myprice) 
SELECT ntext_column1 AS mydate, ntext_column2 AS myprice 
FROM staging_table 
WHERE status_code IS NULL; 

DELETE FROM staging_table 
WHERE status_code IS NULL; 

und die Staging-Tabelle hat alle Fehler, die Sie exportieren und berichten kann.

2

Was verwenden Sie zum Importieren der Datei? DTS verfügt über Skriptfähigkeiten, die zur Datenvalidierung verwendet werden können. Wenn Sie DTS nicht verwenden, verwenden Sie ein benutzerdefiniertes Tool? Wenn ja, machen Sie Ihre Validierung dort.

Aber ich denke, das ist, was Sie suchen.
http://www.sqlteam.com/article/using-dts-to-automate-a-data-import-process

IF @@Error <> 0 
GOTO LABEL 

@op
In SSIS die „rote Linie“ aus einer Importaufgabe Daten können schlechte Zeilen zu einem separaten Ziel umleiten oder zu transformieren. Ich habe schon lange nicht mehr damit gespielt, hoffe aber, dass es hilft.

1

Es sieht aus wie Sie verloren sind. Siehe this Dokument.

TL/DR: Ein Datenkonvertierungsfehler führt immer dazu, dass der gesamte Stapel abgebrochen wird - Ihr SQL-Skript wird nicht weiter ausgeführt, egal was Sie tun. Transaktionen werden nicht helfen. Sie können @@ ERROR nicht überprüfen, da die Ausführung bereits abgebrochen wurde.

Ich würde zuerst überprüfen, warum Sie eine Staging-Datenbank mit varchar (255) Spalten benötigen - kann, was auch immer füllt diese Datenbank die Konvertierung?

Wenn nicht, denke ich, dass Sie ein Programm/Skript schreiben müssen, um aus den Varchar-Spalten auszuwählen, zu konvertieren und in die prod db einzufügen.

1

Führen Sie jeden Cast in einer Transaktion aus, überprüfen Sie nach jedem Cast @@ ERROR, wenn clear, commit und move on.

1

Sie könnten versuchen, vor dem Casting nach dem Datentyp zu suchen und tatsächlich Wurffehler zu vermeiden.

Sie könnten Funktionen wie:

 
ISNUM - to check if the data is of a numeric type 
ISDATE - to check if it can be cast to DATETIME