SQL 2008 - Tote Spalten in der Tabelle oder in der ganzen DB finden - Wie?
Hallo Gemeinde,
gibt es im SQL 2008 Server eine Möglichkeit auf einen Schlag alle Tabellen mit Spalten zu finden, die schon mal angelegt wurden, aber trotzdem noch nie benutzt wurden (tote, leere Spalten, null oder '').
Nach einer Prüfung würde ich diese gerne entfernen (um wieder die Bäume im Wald zu sehen )
Hintergrund:
Es wurden Tabellen aus einem anderen System importiert. Nicht alle Tabellen und Spalten werden benötigt.
Am besten wäre es, wenn man ein Abfrage mit folgenden Spalten machen könnte:
Ausgabe:
Tabellenname - Spalten - leerer oder Null Wert
Am besten wäre, wenn man ein Set von Tabellen definieren kann, z.B. alle Tabellen mit Tabellenname like "A%", damit die Abfrage auch irgendwann fertig wird
Kennt jemand eine Möglichkeit?
P.S.:
Gibt es weiterhin eine Möglichkeit herauszufinden, wann in einer Spalte (allen Spalten) der letzte Datensatz erfaßt wurde?
Das wäre auch ein Indiz für eine veraltete nicht mehr gebrauchte Spalte.
Ausgabe:
Tabellenname - Spalten - Datum letzter Eintrag
Besten Dank.
Rene
gibt es im SQL 2008 Server eine Möglichkeit auf einen Schlag alle Tabellen mit Spalten zu finden, die schon mal angelegt wurden, aber trotzdem noch nie benutzt wurden (tote, leere Spalten, null oder '').
Nach einer Prüfung würde ich diese gerne entfernen (um wieder die Bäume im Wald zu sehen )
Hintergrund:
Es wurden Tabellen aus einem anderen System importiert. Nicht alle Tabellen und Spalten werden benötigt.
Am besten wäre es, wenn man ein Abfrage mit folgenden Spalten machen könnte:
Ausgabe:
Tabellenname - Spalten - leerer oder Null Wert
Am besten wäre, wenn man ein Set von Tabellen definieren kann, z.B. alle Tabellen mit Tabellenname like "A%", damit die Abfrage auch irgendwann fertig wird
Kennt jemand eine Möglichkeit?
P.S.:
Gibt es weiterhin eine Möglichkeit herauszufinden, wann in einer Spalte (allen Spalten) der letzte Datensatz erfaßt wurde?
Das wäre auch ein Indiz für eine veraltete nicht mehr gebrauchte Spalte.
Ausgabe:
Tabellenname - Spalten - Datum letzter Eintrag
Besten Dank.
Rene
Please also mark the comments that contributed to the solution of the article
Content-Key: 191498
Url: https://administrator.de/contentid/191498
Printed on: April 18, 2024 at 02:04 o'clock
9 Comments
Latest comment
Hallo,
Gruß,
Peter
Zitat von @Rene1976:
gibt es im SQL 2008 Server eine Möglichkeit auf einen Schlag alle Tabellen mit Spalten zu finden, die schon mal angelegt wurden, aber trotzdem noch nie benutzt wurden (tote, leere Spalten, null oder '').
Direkt von Haus aus schon? Nein. Warum auch.gibt es im SQL 2008 Server eine Möglichkeit auf einen Schlag alle Tabellen mit Spalten zu finden, die schon mal angelegt wurden, aber trotzdem noch nie benutzt wurden (tote, leere Spalten, null oder '').
Es wurden Tabellen aus einem anderen System importiert. Nicht alle Tabellen und Spalten werden benötigt.
Das ist doch nicht Schuld des SQL Servers, oder?Am besten wäre es, wenn man ein Abfrage mit folgenden Spalten machen könnte:
Dann mach es doch.Am besten wäre, wenn man ein Set von Tabellen definieren kann, z.B. alle Tabellen mit Tabellenname like "A%", damit die Abfrage auch irgendwann fertig wird
Dann tu es.Gibt es weiterhin eine Möglichkeit herauszufinden, wann in einer Spalte (allen Spalten) der letzte Datensatz erfaßt wurde?
Ja.Das wäre auch ein Indiz für eine veraltete nicht mehr gebrauchte Spalte.
Sicher das die dann trotz letzter Änderung vor 90 Jahren nicht gebraucht wird?Gruß,
Peter
Hallo Peter,
super Beitrag!
(Und jetzt komme bitte nicht mit "man muss einen Trigger anlegen, der dann einen Zeitstempel in eine andere Spalte schreibt").
Zur eigentlichen Frage weiß ich leider auch keine Lösung.
Alle in einer Spalte verwendeten Werte lassen sich realtiv einfach herauskriegen, z.B. einfach mit SELECT DISTINCT Spalte FROM Tabelle.
Um wie viele Spalten & Tabellen handelt es sich denn? Wenn das überschaubar ist, könnte man einfach für jede Spalte eine Abfrage erstellen: SELECT '<Tab>' AS Tabelle '<Spalte>' AS Spalte COUNT(*) FROM <Tab> WHERE <Spalte> NOT IsNull <Spalte> (für Syntax übernehme ich keine Garantie)
Das ganze würde ich z.B. in Excel packen, und <Tab> und <Spalte> durch alle relevanten Tabellen/Spalten ersetzen. Dann noch die Zeilen mit UNION verknüpfen und alle gemeinsam ausführen => Du erhältst eine Tabelle, in der für jede Spalte in jeder Tabelle steht, wie viele nicht-Null-Felder sie enthält. (nicht gleich mit 10.000 Abfragen gegen ein Produktivsystem laufen lassen ist natürlich immer ratsam)
Natürlich wird mich jetzt der eine oder andere steinigen wollen, weil das so unglaublich unelegant ist - aber mir reicht es i.A., wenn es funktioniert...
Gruß
Filipp
Beispiel:
super Beitrag!
> Gibt es weiterhin eine Möglichkeit herauszufinden, wann in einer Spalte (allen Spalten) der letzte Datensatz
erfaßt wurde?
Ja.
Das täte mich ja auch interessieren. Hättest du die unendliche Gnade, uns zu erläutern, wie?erfaßt wurde?
Ja.
(Und jetzt komme bitte nicht mit "man muss einen Trigger anlegen, der dann einen Zeitstempel in eine andere Spalte schreibt").
Zur eigentlichen Frage weiß ich leider auch keine Lösung.
Alle in einer Spalte verwendeten Werte lassen sich realtiv einfach herauskriegen, z.B. einfach mit SELECT DISTINCT Spalte FROM Tabelle.
Um wie viele Spalten & Tabellen handelt es sich denn? Wenn das überschaubar ist, könnte man einfach für jede Spalte eine Abfrage erstellen: SELECT '<Tab>' AS Tabelle '<Spalte>' AS Spalte COUNT(*) FROM <Tab> WHERE <Spalte> NOT IsNull <Spalte> (für Syntax übernehme ich keine Garantie)
Das ganze würde ich z.B. in Excel packen, und <Tab> und <Spalte> durch alle relevanten Tabellen/Spalten ersetzen. Dann noch die Zeilen mit UNION verknüpfen und alle gemeinsam ausführen => Du erhältst eine Tabelle, in der für jede Spalte in jeder Tabelle steht, wie viele nicht-Null-Felder sie enthält. (nicht gleich mit 10.000 Abfragen gegen ein Produktivsystem laufen lassen ist natürlich immer ratsam)
Natürlich wird mich jetzt der eine oder andere steinigen wollen, weil das so unglaublich unelegant ist - aber mir reicht es i.A., wenn es funktioniert...
Gruß
Filipp
Beispiel:
Hallo,
Ich habe doch nur die Frage vom TO ob es möglich sei wahrheitsgemäß beantwortet
Gruß,
Peter
Zitat von @filippg:
(Und jetzt komme bitte nicht mit "man muss einen Trigger anlegen, der dann einen Zeitstempel in eine andere Spalte schreibt").
jetzt sag nicht du kennst tatsächlich andere Wege? Natürlich bringt der SQL Server keine Funktion von Haus aus mit welches dies mal eben macht. Warum auch. Das Wissen wann eine Spalte in einer Tabelle einer Datenbank zuletzt geändert wurde ist vermutlich zu 99,9% unwichtig und nur Ballast. Wenn ich also dies wissen will, werde ich nicht umhin kommen mir so eine Information zu schaffen damit ich spätrer daraus zugreifen kann. Möglich ist dies ohne weiteres, aber nicht ohne Aufwand. Ob sinnvoll ist wieder etwqas anderes. Dein Ansatz ist schon ein Lösungsansatz.(Und jetzt komme bitte nicht mit "man muss einen Trigger anlegen, der dann einen Zeitstempel in eine andere Spalte schreibt").
Ich habe doch nur die Frage vom TO ob es möglich sei wahrheitsgemäß beantwortet
Gruß,
Peter
Moin Rene1976,
ich denke (ähnlich wie es auch bei Pjordorf annehme), dass die Fragestellung selbst nicht sinnvoll ist.
Eine Spalte ist doch nicht dann "überflüssig", wenn in der gesamten Tabelle für dieses Feld kein Wert "erfasst wurde".
Sondern erst dann, wenn niemand, sei es User oder Applikation, auf dieses Feld zugreifen kann (z.B. über VIEWs geregelt).
Du kannst beispielsweise jahrelang eine Mitarbeiter-Tabelle in deinem System haben mit den Feldern "Verstorben am", "Vorstrafen" und "Sonderbonus gezahlt", in denen auch bei 150, bei 1500 oder 15000 Datensätzen kein einziges dieser Felder gefüllt ist.
Die Denkrichtung kann doch nicht sein, " wenn in einem dieser Felder etwas steht, dann ist das Feld sinnvoll", sondern doch umgekehrt "wenn es ein als sinnvoll identifiziertes Attribut für mein Entity/für meinen Informationsklumpen 'MITARBEITER' gibt, dann muss es erhalten bleiben/angelegt werden."
Da kannst du nicht mit Datenbank-Automatismen rangehen, sondern die fachlich Verantwortlichen müssen sagen "Brauchen wir/brauchen wir nicht".
Gruß
Biber
ich denke (ähnlich wie es auch bei Pjordorf annehme), dass die Fragestellung selbst nicht sinnvoll ist.
Eine Spalte ist doch nicht dann "überflüssig", wenn in der gesamten Tabelle für dieses Feld kein Wert "erfasst wurde".
Sondern erst dann, wenn niemand, sei es User oder Applikation, auf dieses Feld zugreifen kann (z.B. über VIEWs geregelt).
Du kannst beispielsweise jahrelang eine Mitarbeiter-Tabelle in deinem System haben mit den Feldern "Verstorben am", "Vorstrafen" und "Sonderbonus gezahlt", in denen auch bei 150, bei 1500 oder 15000 Datensätzen kein einziges dieser Felder gefüllt ist.
Die Denkrichtung kann doch nicht sein, " wenn in einem dieser Felder etwas steht, dann ist das Feld sinnvoll", sondern doch umgekehrt "wenn es ein als sinnvoll identifiziertes Attribut für mein Entity/für meinen Informationsklumpen 'MITARBEITER' gibt, dann muss es erhalten bleiben/angelegt werden."
Da kannst du nicht mit Datenbank-Automatismen rangehen, sondern die fachlich Verantwortlichen müssen sagen "Brauchen wir/brauchen wir nicht".
Gruß
Biber
Hallo Peter,
Ich denke da immer an die Feuerzangenbowle: "Stellen wir uns ma janz dumm. Wat is ne Dampfmaschine?" Wobei der Schwerpunkt meiner Gedanken natürlich auf dem ersten Satz liegt.
Filipp
> (Und jetzt komme bitte nicht mit "man muss einen Trigger anlegen, der dann einen Zeitstempel in eine andere Spalte
schreibt").
jetzt sag nicht du kennst tatsächlich andere Wege?
Nee, kenne ich nicht - deswegen hat mich das ja auch interessiert. Aber du hast so getan. Die Frage war nämlich nicht "kann ich das irgendwie so einrichten, dass ich das in Zukunft sehe" sondern "kann ich das abfragen"schreibt").
jetzt sag nicht du kennst tatsächlich andere Wege?
Natürlich bringt der SQL Server keine Funktion von Haus aus mit
welches dies mal eben macht. Warum auch.
Ja, warum auch? Warum sollten Menschen auf den Mond fliegen wollen? Recht hast du bestimmt mit der Aussage, dass das in den allermeisten Fällen unnötiger Overhead wäre. Deswegen hätte es mich ja auch gewundert.welches dies mal eben macht. Warum auch.
Ich habe doch nur die Frage vom TO ob es möglich sei wahrheitsgemäß beantwortet
Ja, ganz toll.Ich denke da immer an die Feuerzangenbowle: "Stellen wir uns ma janz dumm. Wat is ne Dampfmaschine?" Wobei der Schwerpunkt meiner Gedanken natürlich auf dem ersten Satz liegt.
Filipp
Hallo Rene,
die halbe Miete hast Du ja schon mit der Abfrage auf die Systemtabellen. Damit erstellst Du Dir einen Cursor, bastelst Dir Deine Abfrage, wie Du einzelne Spalten überprüfst, in eine nvarchar-Variable zusammen und läßt das ganze als dynamisches SQL laufen (exec sp_executesql). Schon hast Du alle leeren Spalten beisammen.
Gruß, Mad Max
die halbe Miete hast Du ja schon mit der Abfrage auf die Systemtabellen. Damit erstellst Du Dir einen Cursor, bastelst Dir Deine Abfrage, wie Du einzelne Spalten überprüfst, in eine nvarchar-Variable zusammen und läßt das ganze als dynamisches SQL laufen (exec sp_executesql). Schon hast Du alle leeren Spalten beisammen.
Gruß, Mad Max