Wir haben eine Datenbank mit einer Reihe breiter Tabellen (jeweils 40-80 Spalten) und haben einen Fehler gefunden, der NULL-Werte in etwa 500 der Datensätze einführte. Die NULL-Werte können in jeder der Spalten vorkommen (alle sind Integer-Spalten, siehe Abbildung unten), aber diese NULL-Werte verursachen Probleme mit einem unserer Berichtssysteme, die nicht einfach geändert werden können. Wir müssen die NULL-Werte durch einen bestimmten statischen Wert ersetzen (in diesem Fall 99), aber da diese Änderung pro Spalte für mehr als 250 verschiedene Spalten vorgenommen werden muss, würde ich lieber keine einzelnen TSQL-Skripte schreiben, die jede Spalte aktualisieren um eins.
Mein Gehirn ist jetzt zu frittiert, um sich eine clevere Lösung auszudenken, also lautet meine Frage, wie ich diese Aufgabe für alle Spalten einer Tabelle (oder besser noch für mehrere Tabellen) mit einer einfachen und lesbaren SQL-Abfrage ausführen kann. Ich kann die Datensätze einfach genug isolieren, indem Sie für jede Tabelle eine Kette von WHERE (Answer_1 IS NULL) OR (Answer_2 IS NULL) OR ...
oder sogar eine AdministrationsID-Nummer verwenden. Dieser Trick funktioniert jedoch nicht, wenn die Where-Klausel pro Zeile und nicht pro Spalte aktualisiert wird. Irgendwelche Tipps?
Hier ist eine Beispielabfrage, die einige der Datensätze aus 4 verschiedenen Tabellen zeigt:
Es gibt keine Konvention - wenn Sie nur Datensätze verarbeiten wollen, deren jeweilige Spalten NULL sind, müssen Sie Folgendes verwenden:
%Vor%Aber Sie könnten dies in der UPDATE-Anweisung verwenden:
%Vor%Die Logik ist, dass der Wert nur dann auf 99 aktualisiert wird, wenn der Spaltenwert NULL ist, weil COALESCE funktioniert - Rückgabe des ersten Nicht-NULL-Werts (Verarbeitung der Liste von links nach rechts).
Da du das alles überall machen musst, habe ich Javascript geschrieben, um dir beim Erstellen des SQL zu helfen. Schneide sie aus und füge sie in deine Browser-Adressleiste ein, um deine sql.
zu erhalten %Vor%Passen Sie einfach die sys.columns-Tabelle für jede Tabelle an und erstellen Sie dynamische sql ... Es ist brutal, aber es erspart Ihnen, alle t-sql-outs zu schreiben.
Zum Beispiel:
%Vor%Ich mag die Idee nicht, die Daten selbst für den Zweck der Berichterstattung zu manipulieren. Wenn Sie die NULL-Werte auf 99 ändern, um die Berichterstellung zu vereinfachen, werden diese Daten als beschädigt eingestuft. Was ist, wenn es außer der Berichterstattung andere Verbraucher gibt, die echte Daten benötigen?
Ich würde lieber eine intelligente Abfrage für den Bericht schreiben. Wenn Sie beispielsweise ISNULL (spaltenname, 99) verwenden, wird 99 zurückgegeben, wenn der Spaltenwert NULL ist.
Tags und Links sql sql-server sql-server-2005 tsql sql-update