In meiner Legacy-Datenbank lässt das Schema häufig unnötigerweise Null-Einträge für bestimmte Spalten zu. Um herauszufinden, welche Spalten besonders wichtig sind, muss ich SQL Server 2008 abfragen, das über mein Fachwissen hinausgeht. Mein Ziel ist es, das Schema ein wenig zu straffen und mich vor dem Nullfall in meinem Code zu schützen.
Eine grobe Methode (Option 1) zur Lösung meines Problems besteht darin, alle Datensätze abzurufen (und * auszuwählen), die mindestens einen Nulleintrag enthalten, und dann nach Spalten zu suchen, die keine Nulleinträge enthalten. Ich könnte natürlich nur verwenden Where columnA IS NULL OR columnB IS NULL OR columnC IS NULL
, aber das wird für Tabellen mit vielen Spalten langweilig. Einige Tabellen in dieser Datenbank enthalten mehr als zwanzig Spalten! Außerdem gibt es insgesamt etwa 500 Tische. Allgemeine Lösungen sind also am besten.
Hier sind drei Optionen für Antworten, die mich zufrieden stellen würden:
- Option 1: "Holen Sie mir alle Datensätze, bei denen mindestens eine der Spalten null ist". Ich werde nach Spalten ohne Null-Einträge suchen.
- Option 2: Eine noch bessere Antwort wäre ein Skript, das eine Liste von Spaltennamen erhält, die mindestens einen Nulleintrag enthalten. Dann werde ich manuell sehen, welche nullbaren Spalten nicht in dieser Liste enthalten sind.
- Option 3: Die beste Antwort würde mir eine Liste von Spaltennamen geben, die in ihrem Schema als nullwertfähig markiert sind, obwohl in diesen Spalten keine Datensätze mit einem Nulleintrag vorhanden sind.
Vielen Dank!
null
irgendwo eine haben oder würde eine Schätzung reichen?Antworten:
Die Antwort von Martin Smith wird sehr gut dazu dienen, Ihnen alle Spalten zu liefern, die Sie für eine gesamte Datenbank in SQL 2008 benötigen. Sehr schön!
Hier ist, wie ich es in den Tagen gemacht habe, bevor SQL CTEs und PIVOT hatte. Dies ist kompatibel mit älteren SQL-Versionen, bei denen Martins Lösung nicht funktioniert und auch 2008 funktioniert, jedoch mit einer schlechteren Leistung als seine Lösung.
quelle
NULL
gefunden wird, ohne dass die gesamte Tabelle gescannt werden muss. Übrigens ist es besser,QUOTENAME
die eckigen Klammern selbst zu verwenden, als sie zu verketten, da dies automatisch Objektnamen behandelt, die das]
Zeichen enthalten.Sie können verwenden
sys.sp_MSforeachtable
, um alle Tabellen zu durchlaufen und wie folgt zu verarbeiten (möglicherweise müssen Anpassungen vorgenommen werden, wenn Sie nicht standardmäßige Objektnamen haben, die das'
Zeichen enthalten, aber ich werde dies als Übung belassen.)quelle
'
Zeichen enthalten?Vielleicht hilft diese StackOverflow-Antwort: /programming/63291/sql-select-columns-with-null-values-only
Es sieht so aus, als ob es für 2005 geplant ist, hoffe es funktioniert.
Wie gewünscht erweitert (glaube ich):
Ersetzen Sie ADDR_Address durch Ihren Tabellennamen.
quelle
In SQL Server werden einige Systemansichten speziell zur Beschreibung von Objektdefinitionen verwendet: INFORMATION_SCHEMA.Tables, Columns usw.
In diesem Fall benötigen Sie etwa die folgende Abfrage, um nur die letzte Frage zu beantworten ("Liste der Spaltennamen, die in ihrem Schema als nullwertfähig markiert sind ..."):
Dadurch erhalten Sie eine Liste mit Spalten für eine bestimmte Datenbank und Tabelle. Entfernen Sie den Tabellenfilter und Sie erhalten das gewünschte Ergebnis für die gesamte Datenbank. Die INFORMATION_SCHEMA-Ansichten beziehen sich nur auf die aktuell verwendete Datenbank. Sie können sie daher nicht für alle Datenbankdaten gleichzeitig verwenden, es sei denn, Sie führen eine dynamische SQL aus.
quelle