Wörter in SQL-Datenbank suchen
hallo,
gibt es eine möglichkeit ein bestimmtes wort in einer sql-datenbank zu suchen? ohne, dass man die Tabelle kennt?
die datenbank läuft unter microsoft sql 2005.
gruß,
michael
gibt es eine möglichkeit ein bestimmtes wort in einer sql-datenbank zu suchen? ohne, dass man die Tabelle kennt?
die datenbank läuft unter microsoft sql 2005.
gruß,
michael
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 79577
Url: https://administrator.de/forum/woerter-in-sql-datenbank-suchen-79577.html
Ausgedruckt am: 26.12.2024 um 15:12 Uhr
23 Kommentare
Neuester Kommentar
Moin MiSt,
ja, natürlich...
Aber nicht ganz ohne Vorbereitung.
Siehe zum Einstieg SQL Server Developer Center: 10 Ways to Optimize SQL Server full-text Indexing.
Und die darin angegebenen 20 Links zu Linksammlungen.
Aber in 17 Mannjahren und mit 20 Mio Euro ist es machbar.
Google und Yahoo haben es ja auch hinbekommen.
Grüße
Biber
ja, natürlich...
Aber nicht ganz ohne Vorbereitung.
Siehe zum Einstieg SQL Server Developer Center: 10 Ways to Optimize SQL Server full-text Indexing.
Und die darin angegebenen 20 Links zu Linksammlungen.
Aber in 17 Mannjahren und mit 20 Mio Euro ist es machbar.
Google und Yahoo haben es ja auch hinbekommen.
Grüße
Biber
Hallo,
ja, es geht, aber ein bisserl Aufwand muss sein:
Man nehme folgendes SQL-Statement:
select 'select distinct ''gefunden in Tabelle '
+ table_name + ' Spalte '
+ column_name + ' '' from ' + table_name
+ ' where ' + column_name + ' like ''%wassuchenwirdenn%'' union all '
from information_schema.columns
where data_type in ('varchar','text')
order by 1
Den Text "wassuchenwirdenn" bitte entsprechend ersetzen.
Wenn Du nun hergehst und dieses SQL ausführts, erhälts Du eine mehr oder weniger große Ergebnismenge, die zu allen Tabellen und allen Spalten vom Typ varchar oder text ein SQL-Statement enthält.
Im SQL Server Management Studio kannst Du nun mit der rechten Maustaste in der Ergebnismenge alles markieren auswählen und anschließend kopieren. Das Ergebnis fügst Du nun in ein neues Abfragefenster ein und entfernst in der letzten Zeile das union all.
Danach kann das SQL ausgeführt werden.
Bei großen Datenbanken kann es sein, dass Du dieses Statement in mehrere aufteilen mußt. Probieren geht hier über studieren.
Als Ergebnis solltest Du in etwa folgendes bekommen:
gefunden in Tabelle tabellenname Spalte spaltenname
und das für jede Tabelle und Spalte, in der sich eine weitere Suche "lohnt".
Hoffe das hilft, hat mir zumindest soeben geholfen, hatte nämlich genau das Problem zu lösen.
SchöGrü
Stephan
ja, es geht, aber ein bisserl Aufwand muss sein:
Man nehme folgendes SQL-Statement:
select 'select distinct ''gefunden in Tabelle '
+ table_name + ' Spalte '
+ column_name + ' '' from ' + table_name
+ ' where ' + column_name + ' like ''%wassuchenwirdenn%'' union all '
from information_schema.columns
where data_type in ('varchar','text')
order by 1
Den Text "wassuchenwirdenn" bitte entsprechend ersetzen.
Wenn Du nun hergehst und dieses SQL ausführts, erhälts Du eine mehr oder weniger große Ergebnismenge, die zu allen Tabellen und allen Spalten vom Typ varchar oder text ein SQL-Statement enthält.
Im SQL Server Management Studio kannst Du nun mit der rechten Maustaste in der Ergebnismenge alles markieren auswählen und anschließend kopieren. Das Ergebnis fügst Du nun in ein neues Abfragefenster ein und entfernst in der letzten Zeile das union all.
Danach kann das SQL ausgeführt werden.
Bei großen Datenbanken kann es sein, dass Du dieses Statement in mehrere aufteilen mußt. Probieren geht hier über studieren.
Als Ergebnis solltest Du in etwa folgendes bekommen:
gefunden in Tabelle tabellenname Spalte spaltenname
und das für jede Tabelle und Spalte, in der sich eine weitere Suche "lohnt".
Hoffe das hilft, hat mir zumindest soeben geholfen, hatte nämlich genau das Problem zu lösen.
SchöGrü
Stephan
Hallo,
womit arbeitest Du denn, wenn Du mit der Datenbank arbeitest?
Vermutlich mit dem SQL-Server Management Studio, da es eine MS-SQL-Datenbank ist.
Bei der Version, mit der ich arbeite ist oben links ein Button "Neue Abfrage".
Draufklicken. Rechts geht nun ein Editierfenster auf. Script per copy&paste da rein.
Suchbegriff "wassuchenwirdenn" anpassen, F5 drücken. Nun sollte, nach mehr oder weniger Zeit unten die Ergebnismenge erscheinen.
Dort reinklicken, rechte Maustaste, alles markieren wählen, wieder rechte Maustaste und kopieren wählen. Button "Neue Abfrage" betätigen, im neuen Fenster strg+v zum Einfügen der Zwischenablage. Ans Ende des Textes gehen und das letzte "union all" entfernen. F5.
Nach mehr oder weniger langer Zeit sollte eine Ergebnismenge erscheinen, der Du entnehmen kannst, in welcher Tabelle und welcher Spalte das Wort gefunden wurde.
Aber nichts für Ungut, wenn Du dich weder mit SQL noch mit dem Datenbankwerkzeug auskennst, dann lass da mal die Finger von, bis Du bei beidem weißt, was Du machst.
Je nach größe der Datenbank können das Script und das hiermit generierte Script den Datenbankserver schon arg belasten.
Und Fehlerfreiheit wird nicht garantiert!!!
Ist also nix für den täglichen Gebrauch.
SchöGrü
Stephan
womit arbeitest Du denn, wenn Du mit der Datenbank arbeitest?
Vermutlich mit dem SQL-Server Management Studio, da es eine MS-SQL-Datenbank ist.
Bei der Version, mit der ich arbeite ist oben links ein Button "Neue Abfrage".
Draufklicken. Rechts geht nun ein Editierfenster auf. Script per copy&paste da rein.
Suchbegriff "wassuchenwirdenn" anpassen, F5 drücken. Nun sollte, nach mehr oder weniger Zeit unten die Ergebnismenge erscheinen.
Dort reinklicken, rechte Maustaste, alles markieren wählen, wieder rechte Maustaste und kopieren wählen. Button "Neue Abfrage" betätigen, im neuen Fenster strg+v zum Einfügen der Zwischenablage. Ans Ende des Textes gehen und das letzte "union all" entfernen. F5.
Nach mehr oder weniger langer Zeit sollte eine Ergebnismenge erscheinen, der Du entnehmen kannst, in welcher Tabelle und welcher Spalte das Wort gefunden wurde.
Aber nichts für Ungut, wenn Du dich weder mit SQL noch mit dem Datenbankwerkzeug auskennst, dann lass da mal die Finger von, bis Du bei beidem weißt, was Du machst.
Je nach größe der Datenbank können das Script und das hiermit generierte Script den Datenbankserver schon arg belasten.
Und Fehlerfreiheit wird nicht garantiert!!!
Ist also nix für den täglichen Gebrauch.
SchöGrü
Stephan
Hallo,
habe es gerade per Copy&Paste von dieser Seite genommen und in einer Datenbank meiner Wahl ausgeführt. Hat funktioniert, sind also keine ' zuviel. Falls dich die Menge der ' interessiert:
Hier wird per SQL SQL generiert und um innerhalb von Zeichenfolgen ein ' zu bekommen, muss man '' eingeben und wenn dass dann am Anfang oder am Ende einer Zeihenfolge ist, wird daraus ''' und wenn man nur ein ' im Ergebnis haben will, dann wird daraus ''''.
Probier doch einfach mal
select ''''
das geht bei SQL-Server.
SchöGrü
Stephan
habe es gerade per Copy&Paste von dieser Seite genommen und in einer Datenbank meiner Wahl ausgeführt. Hat funktioniert, sind also keine ' zuviel. Falls dich die Menge der ' interessiert:
Hier wird per SQL SQL generiert und um innerhalb von Zeichenfolgen ein ' zu bekommen, muss man '' eingeben und wenn dass dann am Anfang oder am Ende einer Zeihenfolge ist, wird daraus ''' und wenn man nur ein ' im Ergebnis haben will, dann wird daraus ''''.
Probier doch einfach mal
select ''''
das geht bei SQL-Server.
SchöGrü
Stephan
Hallo,
ich glaube, wir haben hier ein Verständigungsproblem.
Wenn ich Dich recht verstehe, so hast Du in der Datenbank ca. 6200 Spalten vom Typ Varchar oder Text, also Kandidaten, die für die Suche in Frage kommen könnten.
Dies heißt jetzt noch nicht, dass dort irgendwo das SUCHWORT enthalten ist.
Ob das Suchwort in einer Tabelle enthalten ist, ergibt sich erst durch ausführen dieser ca. 6200 Zeilen als ein Statement oder ggfls. aufgeteilt auf mehrere (was mir bei der Menge sinnvoll erscheint).
Das
select distinct 'gefunden in Tabelle dtproperties Spalte property ' from dtproperties where property like '%SUCHWORT%'
sollte Dir dann und nur dann eine Ergebniszeile liefern, wenn in der Tabelle und der Spalte das Suchwort enthalten ist. Bei einer leeren Tabelle gibt's auch kein Ergebnis. D. H.: Gibt's das Wort nicht in der Datenbank, so führen die 6200 Zeilen zu einer leeren Ergebnismenge. Kommt das Suchwort nur einmal in der Datenbank vor, so gibt es nur eine Ergebniszeile. Für leere Tabellen wird nichts gefunden. Dies ist so beabsichtigt.
Die Tabelle dtproperties ist als Beispiel schlecht geeignet, da es sich um eine Systemtabelle handelt. Eventuell versuchst Du aus den 6200 Zeilen zuerst mal die Zeilen rauszufinden, die Tabellen enthalten, in denen Du suchen möchtest. Wie ich das SQL so ändern kann, dass keine Systemtabellen mit durchsucht werden, weiß ich momentan nicht.
SchöGrü
Stephan
ich glaube, wir haben hier ein Verständigungsproblem.
Wenn ich Dich recht verstehe, so hast Du in der Datenbank ca. 6200 Spalten vom Typ Varchar oder Text, also Kandidaten, die für die Suche in Frage kommen könnten.
Dies heißt jetzt noch nicht, dass dort irgendwo das SUCHWORT enthalten ist.
Ob das Suchwort in einer Tabelle enthalten ist, ergibt sich erst durch ausführen dieser ca. 6200 Zeilen als ein Statement oder ggfls. aufgeteilt auf mehrere (was mir bei der Menge sinnvoll erscheint).
Das
select distinct 'gefunden in Tabelle dtproperties Spalte property ' from dtproperties where property like '%SUCHWORT%'
sollte Dir dann und nur dann eine Ergebniszeile liefern, wenn in der Tabelle und der Spalte das Suchwort enthalten ist. Bei einer leeren Tabelle gibt's auch kein Ergebnis. D. H.: Gibt's das Wort nicht in der Datenbank, so führen die 6200 Zeilen zu einer leeren Ergebnismenge. Kommt das Suchwort nur einmal in der Datenbank vor, so gibt es nur eine Ergebniszeile. Für leere Tabellen wird nichts gefunden. Dies ist so beabsichtigt.
Die Tabelle dtproperties ist als Beispiel schlecht geeignet, da es sich um eine Systemtabelle handelt. Eventuell versuchst Du aus den 6200 Zeilen zuerst mal die Zeilen rauszufinden, die Tabellen enthalten, in denen Du suchen möchtest. Wie ich das SQL so ändern kann, dass keine Systemtabellen mit durchsucht werden, weiß ich momentan nicht.
SchöGrü
Stephan
Hallo Michael,
in Bezug auf Literatur zu MS-SQL hab' ich keine Ahnung, das, was ich weiß, ist nur bei try and error oder Google.
Naja, Import aus Excel hab' ich auch noch nicht gemacht, daher hier mal so meine Idee, wie ich vorgehen würde:
In die erste Zeile von Excel die Namen der Spalten, wie sie in der Tabelle heißen schreiben, dann das Ganze als CSV mit Komma als Trennzeichen speichern und darauf achten, das Zeichenfolgen in einfachen Hochkommata stehen und nicht in doppelten.
Die erste Zeile nehmen und davor ein
insert into Tabelle (
schreiben und dahinter ein
) values (
das dann vor jede Zeile kopieren und anschließend an jede Zeile ein
);
hängen. Damit dürfte dann ein Insertscript zur Verfügung stehen.
Mit einem guten Editor wie z. B. UltraEdit dürfte sowas mit ein paar Schritten per "globalchange" recht gut und schnell zu machen sein.
Bei wenigen Datensätzen auch so per Hand.
SchöGrü
Stephan
in Bezug auf Literatur zu MS-SQL hab' ich keine Ahnung, das, was ich weiß, ist nur bei try and error oder Google.
Naja, Import aus Excel hab' ich auch noch nicht gemacht, daher hier mal so meine Idee, wie ich vorgehen würde:
In die erste Zeile von Excel die Namen der Spalten, wie sie in der Tabelle heißen schreiben, dann das Ganze als CSV mit Komma als Trennzeichen speichern und darauf achten, das Zeichenfolgen in einfachen Hochkommata stehen und nicht in doppelten.
Die erste Zeile nehmen und davor ein
insert into Tabelle (
schreiben und dahinter ein
) values (
das dann vor jede Zeile kopieren und anschließend an jede Zeile ein
);
hängen. Damit dürfte dann ein Insertscript zur Verfügung stehen.
Mit einem guten Editor wie z. B. UltraEdit dürfte sowas mit ein paar Schritten per "globalchange" recht gut und schnell zu machen sein.
Bei wenigen Datensätzen auch so per Hand.
SchöGrü
Stephan
Hallo,
wie der Import von CSV geht, weiß ich nicht, hab' ich noch nie gemacht.
Eine Liste der Tabellen und Spalten mit Datentyp und Länge kannst Du so bekommen:
SELECT
Table_name, column_name, data_type, Character_Maximum_Length
FROM INFORMATION_SCHEMA.COLUMNS
--WHERE (TABLE_NAME in ('tabelle_1','tabelle_2','...','tabelle_n'))
where table_name in (select table_name from INFORMATION_SCHEMA.Tables)
order by table_name, ordinal_position
Hierbei hast Du die Möglichkeit alle Tabellen ausgeben zu lassen oder wenn Du die auskommentierte Where-Bedingung benutzt, in der In-Klausel alle Tabellen aufzuführen, für die Du die Spaltenangaben brauchst.
Das Ergebnis könnte dann so aussehen:
SchöGrü
Stephan
wie der Import von CSV geht, weiß ich nicht, hab' ich noch nie gemacht.
Eine Liste der Tabellen und Spalten mit Datentyp und Länge kannst Du so bekommen:
SELECT
Table_name, column_name, data_type, Character_Maximum_Length
FROM INFORMATION_SCHEMA.COLUMNS
--WHERE (TABLE_NAME in ('tabelle_1','tabelle_2','...','tabelle_n'))
where table_name in (select table_name from INFORMATION_SCHEMA.Tables)
order by table_name, ordinal_position
Hierbei hast Du die Möglichkeit alle Tabellen ausgeben zu lassen oder wenn Du die auskommentierte Where-Bedingung benutzt, in der In-Klausel alle Tabellen aufzuführen, für die Du die Spaltenangaben brauchst.
Das Ergebnis könnte dann so aussehen:
Table_name | column_name | data_type | Character_Maximum_Length |
---|---|---|---|
Abfragen | ID | int | NULL |
Abfragen | Description | varchar | 100 |
Abfragen | Kategorie | varchar | 100 |
Abfragen | SQL | varchar | 4000 |
SchöGrü
Stephan
Hallo,
da muss ich jetzt passen.
Das Script liefert doch die Datentypen der Datenbank, eigentlich unabhängig von der Datenbankversion.
Wie heißt denn die genaue Fehlermeldung, wie ist die Tabellenstruktur und wie sehen konkret die "fehlerhaften" Daten aus?
Wo bitte kommt das "string [dt_str]" her? Das würde ich erstmal als varchar interpretieren.
Bei DateTime könnte es auf das Datumsformat ankommen, TT.MM.JJJJ oder YYYY-MM-DD oder welche Kombination auch immer Datenbank und Datenquelle benutzen.
SchöGrü
Stephan
da muss ich jetzt passen.
Das Script liefert doch die Datentypen der Datenbank, eigentlich unabhängig von der Datenbankversion.
Wie heißt denn die genaue Fehlermeldung, wie ist die Tabellenstruktur und wie sehen konkret die "fehlerhaften" Daten aus?
Wo bitte kommt das "string [dt_str]" her? Das würde ich erstmal als varchar interpretieren.
Bei DateTime könnte es auf das Datumsformat ankommen, TT.MM.JJJJ oder YYYY-MM-DD oder welche Kombination auch immer Datenbank und Datenquelle benutzen.
SchöGrü
Stephan
Hallo,
na da stehst Du vor dem Problem, dass ich an dieser Datenbank so hasse:
Fehlermeldungen ja, aber absolut informationslos und unbrauchbar.
Die letzte Meldung könnte darauf hinweisen, dass irgendwo in der CSV-Datei in Zeile 42 ein Fehler in den Daten ist. Das ist jetzt aber nur Spekulation.
Versuch's mal mit allen Zeilen bis vor der 42ten. Wenn das funktioniert, dann hab' ich richtig geraten. Es könnte aber auch die 42. Spalte sein.
Ausgehend von der zweiten Meldung liegt hier ein Typeproblem bei irgendeiner Spalte vor.
Ansonsten schaust Du bitte mal hier: http://cs.berwickheights.com/blogs/sjblog/archive/2006/09/22/SQLSvr2005 ... , da hatte jemand wohl ein ähnliches Problem.
Ansonsten hilft hier eventuell Google mit den Suchbegriffen: +SQL-Server +0xC0202025
Bitte alle Fehlernummern durchprobieren. Anders käme ich hier jetzt auch nicht mehr weiter.
SchöGrü
Stephan
na da stehst Du vor dem Problem, dass ich an dieser Datenbank so hasse:
Fehlermeldungen ja, aber absolut informationslos und unbrauchbar.
Die letzte Meldung könnte darauf hinweisen, dass irgendwo in der CSV-Datei in Zeile 42 ein Fehler in den Daten ist. Das ist jetzt aber nur Spekulation.
Versuch's mal mit allen Zeilen bis vor der 42ten. Wenn das funktioniert, dann hab' ich richtig geraten. Es könnte aber auch die 42. Spalte sein.
Ausgehend von der zweiten Meldung liegt hier ein Typeproblem bei irgendeiner Spalte vor.
Ansonsten schaust Du bitte mal hier: http://cs.berwickheights.com/blogs/sjblog/archive/2006/09/22/SQLSvr2005 ... , da hatte jemand wohl ein ähnliches Problem.
Ansonsten hilft hier eventuell Google mit den Suchbegriffen: +SQL-Server +0xC0202025
Bitte alle Fehlernummern durchprobieren. Anders käme ich hier jetzt auch nicht mehr weiter.
SchöGrü
Stephan