2016-04-26 2 views
1

Ich habe ein SSIS-Paket, das Daten aus einer Flat-Datei einliest und in eine SQL Server 2012-Datenbank schreibt. Die Daten enthalten Nullwerte für einige Felder. Ich möchte die Zeilen behalten, die Nullwerte haben, aber sie durch Standardwerte ersetzen, ohne eine Konvertierung für jede Spalte durchführen zu müssen (es gibt Hunderte von Spalten über eine Anzahl von Tabellen).Ersetzen von Null-Werten in SQL Server 2012 von SSIS-Paket

Gibt es irgendwelche SQL-Befehle/Scripts, um NULL in einer Reihe von Tabellen mit einem Standard zu aktualisieren, der auf dem Datentyp unabhängig von der Spalte basiert? Gibt es alternativ in SSIS 2012 eine Möglichkeit, NULL durch einen Standardwert ohne Datenkonvertierung für jede Spalte zu ersetzen?

Zum Beispiel, hätte ich Spalte "E-Mail" (varchar (255)) für Kunden, bei denen wir eine E-Mail-Adresse hatten. Wie kann ich dann jeden dieser Nullen in eine leere Zeichenkette ('') ändern, aber über Hunderte von Tabellen, ohne jeden explizit anzugeben?

Ich habe versucht, einen Standardwert in der Tabellendefinition zu verwenden, aber es verwendet immer noch NULL-Werte, da sie explizit gesendet werden.

Antwort

0

Sie könnten Daten aus Ihrer flachen Datei in einen Haltetisch importieren dann einen Lauf Bulk Insert?

1

Nun, ich habe gelernt, etwas interessante und möglicherweise nützlich für Sie.

Ich wusste schon, dass es möglich war, mit dieser eine Reihe von all Standardwert einzufügen:

INSERT INTO dbo.DefTest DEFAULT VALUES; 

Ihre Frage machte mich fragen, ob es eine ähnliche Art und Weise war Werte auf ihren Standardwert zu aktualisieren. Also habe ich dieses Experiment versucht:

CREATE TABLE dbo.DefTest (
    Id int NULL DEFAULT (0) 
, AStr varchar(15) NULL DEFAULT ('A') 
, BStr varchar(15) NULL DEFAULT ('B') 
, TF bit NULL DEFAULT (0) 
, Amount money NULL DEFAULT (100.00) 
); 

INSERT INTO dbo.DefTest VALUES (1,'Test','Test',1,20); 
INSERT INTO dbo.DefTest DEFAULT VALUES; 
INSERT INTO dbo.DefTest VALUES (NULL,NULL,NULL,NULL,NULL); 

SELECT * FROM dbo.DefTest; 

Die SELECT produziert genau das, was Sie erwarten würden. Eine Zeile mit den angegebenen Werten, eine Zeile mit allen Standardwerten und eine Zeile mit allen NULL-Werten.

Dann habe ich versucht, dies:

UPDATE dbo.DefTest 
SET Id = DEFAULT 

Das Ergebnis war das, was ich gehofft hatte: Alle Zeilen einen ID-Wert von 0 hatte, die Standardeinstellung.

Jetzt jede Spalte auf den Standardwert auf nur gesetzt, wenn es zur Zeit NULL ist, würde ich brauche CASE-Anweisungen zu verwenden, so dass ich versuchte, dies:

UPDATE dbo.DefTest 
SET Id=CASE WHEN Id IS NULL THEN DEFAULT ELSE Id END 
, AStr = CASE WHEN AStr IS NULL THEN DEFAULT ELSE AStr END 
, BStr = CASE WHEN BStr IS NULL THEN DEFAULT ELSE BStr END 
, TF = CASE WHEN TF IS NULL THEN DEFAULT ELSE TF END 
, Amount = CASE WHEN Amount IS NULL THEN DEFAULT ELSE Amount END 

Aber ich habe:

Falsche Syntax neben dem Schlüsselwort 'DEFAULT'.

Also ich denke, dass UPDATE-Anweisungen DEFAULT nur als direkte Zuweisung von Spaltenwert verwenden können.

So zu tun, was Sie wollen, würden Sie einfach ein UPDATE für jede Spalte ausführen müssen, die einen Standardwert hat, dass Sie NULL-Werte verwenden möchten, ersetzen:

UPDATE MyTable 
SET MyColumn = DEFAULT 
WHERE MyColumn IS NULL 

ich vergewissert haben, dass das funktioniert.

Sie können sich die Mühe sparen, Hunderte von Anweisungen zu schreiben, indem Sie Meta-Views/-Tabellen abfragen und dynamische SQL-Anweisungen erzeugen und ausführen.

Verwandte Themen