mist
Goto Top

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

Content-ID: 79577

Url: https://administrator.de/forum/woerter-in-sql-datenbank-suchen-79577.html

Ausgedruckt am: 26.12.2024 um 15:12 Uhr

Biber
Biber 30.01.2008 um 19:00:58 Uhr
Goto Top
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
nahpets
nahpets 31.01.2008 um 17:53:46 Uhr
Goto Top
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
MiSt
MiSt 01.02.2008 um 06:28:25 Uhr
Goto Top
hi,
vielen dank für diesen tip.
da ich aber 0 ahnung im bereich sql habe (ich steige da gerade mit ein), stellt sich mir die frage, wo ich dieses script eintragen kann.

michael
nahpets
nahpets 01.02.2008 um 07:34:59 Uhr
Goto Top
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
MiSt
MiSt 01.02.2008 um 08:25:27 Uhr
Goto Top
hi,
vielen dank. ich werde das nacher mal testen.
MiSt
MiSt 05.02.2008 um 14:37:28 Uhr
Goto Top
hi,
ist das skript richtig? oder sind da ein paar ''' zuviel drin?
nahpets
nahpets 05.02.2008 um 15:34:27 Uhr
Goto Top
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
MiSt
MiSt 05.02.2008 um 15:40:14 Uhr
Goto Top
ok, vielleicht habe ich auch was falsch gemacht. Ich versuch es gleich nochmal.
MiSt
MiSt 06.02.2008 um 07:20:47 Uhr
Goto Top
hi,
ich habe es versucht und er bekommt ca. 6200 Zeilen

hier eine zeile:
select distinct 'gefunden in Tabelle [TABELLE] Spalte [SPALTE] ' from [TABELLE] where [SPALTE] like '%SUCHWORT%' union all

und in der ersten zeile steht:
select distinct 'gefunden in Tabelle dtproperties Spalte property ' from dtproperties where property like '%SUCHWORT%' union all

die richtigen werte habe ich durch [TABELLE] & [SPALTE] & SUCHWORT ersetzt.

da steht aber das gesuchte wort nicht drin. die tabelle ist leer.
was habe ich falsch gemacht?

wenn ich ein wenig mit den leerzeichen "rumspiele" läuft das script, aber er findet garnichts. face-wink
nahpets
nahpets 06.02.2008 um 09:16:17 Uhr
Goto Top
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
MiSt
MiSt 07.02.2008 um 08:27:51 Uhr
Goto Top
hi,
erstmal vielen dank für deine gedult.
ich hab mir die mühe gemacht und habe zu fuß nach dem gesuchten wort gesucht.

ich hätte da noch ein anderes anliegen:
ich möchte gerne spalten aus einer excel-datei in eine sql-tabelle importieren.
exportieren bekomme ich hin; über den "sql server-import-/export-assistent"
bei importieren muss man "wieder" einen skript schreiben.
ich habe eine tabelle in .xls exportiert und in excel die spalten gefüllt. jetzt würde ich gerne das ganze zurück importieren.

könntest du, wenn du zeit & lust hast, mir eventuell dabei helfen?

gibt es eventuell ein buch zum thema ms sql 2005, welches leicht (für "dummies") geschrieben ist und mit praktischen tricks/tipps an die sache ran gehen?

gruß,
michael
nahpets
nahpets 07.02.2008 um 09:09:30 Uhr
Goto Top
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
MiSt
MiSt 07.02.2008 um 10:05:06 Uhr
Goto Top
werde ich gleich mal testen.
aber wenn ich z.b. data_1 als sql-spalte habe; woher weis sql, beim importieren, in welcher tabelle diese spalte ist?
nahpets
nahpets 07.02.2008 um 10:08:36 Uhr
Goto Top
Das ergibt sich doch aus dem

insert into Tabelle

Tabelle mußt du durch den entsprechenden Tabellennamen ersetzen. Dabei gehe ich davon aus, dass die Exceltabelle nur Werte für eine Tabelle enthält. Andernfalls funktioniert das nicht.
MiSt
MiSt 07.02.2008 um 11:13:17 Uhr
Goto Top
ok, habe ich verstanden. je tabelle eine xls-datei.
MiSt
MiSt 13.02.2008 um 13:55:35 Uhr
Goto Top
hi,
ich habe nochmal eine frage zum importieren in sql-tabellen.
wenn ich eine csv-datei nehme und die importiere, dann ist die die länge irgendwie immer 50 (outputcolumnwidth). die vorhandene tabelle hat aber gunterschiedliche länge vordiffiniert. wie kann ich das umgehen? ich kann die zwar bei jeder spalte in dem assistenten zu fuß ändern. das gblöde ist aber, das ich die richtige länge nicht kenne. ich sehe die erst, wenn ich im nächsten schritt die tabelle auswähle, wo ich datein reinschieben möchte. und das bei ca. 30-40 spalten, ist das etwas zeitaufwendig.
nahpets
nahpets 13.02.2008 um 14:27:52 Uhr
Goto Top
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:

Table_namecolumn_namedata_typeCharacter_Maximum_Length
AbfragenIDintNULL
AbfragenDescriptionvarchar100
AbfragenKategorievarchar100
AbfragenSQLvarchar4000

SchöGrü

Stephan
MiSt
MiSt 14.02.2008 um 12:55:19 Uhr
Goto Top
hi,
vielen dank hat funktioniert.

jetzt habe ich das soweit eingestellt, aber ich bekomme irgendwie immer noch eine fehlermeldung.
gibt es irgendwas, worauf ich achten muss? ich will eigentlich "nur" daten importieren. kann das sein, dass durch die abhängigkeit, die bei einigen tabellen vorhanden ist, dadurch fehlermeldungen auftauchen?
nahpets
nahpets 14.02.2008 um 12:59:22 Uhr
Goto Top
Hallo,

wie lauten die Fehlermeldungen?

Zu den Abhängigkeiten: Natürlich muss hier die Reihenfolge beachtet werden. Ohne fundierte Kenntnisse des Datenmodells würd' ich mich an eine Befüllung "von Hand" nicht rantrauen.

SchöGrü

Stephan
MiSt
MiSt 14.02.2008 um 14:36:57 Uhr
Goto Top
habe den fehler erkannt. der "datatype" ist nicht korrekt angegeben. im standart beim import ist der bei "string [dt_str]". ich muss die spalten aber in varchar, datetime und int ändern (laut deinem skript). leider finde ich die werde aber bei "datatype" nicht. heisen die bei dem sql 2005 anders?
nahpets
nahpets 14.02.2008 um 14:54:57 Uhr
Goto Top
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
MiSt
MiSt 14.02.2008 um 15:02:41 Uhr
Goto Top
hier die fehlermeldung:

- Vor der Ausfhrung (Fehler)
Meldungen
Informationen 0x402090dc: Datenflusstask: Die Verarbeitung der Datei 'D:\Daten\1002.csv wurde gestartet.
(SQL Server-Import/Export-Assistent)

Fehler 0xc0202009: Datenflusstask: SSIS-Fehlercode 'DTS_E_OLEDBERROR'. OLE DB-Fehler. Fehlercode: 0x80040E21.
Ein OLE DB-Datensatz ist verfgbar. Quelle: 'Microsoft SQL Native Client' HRESULT: 0x80040E21 Beschreibung: 'Fehler bei einem aus mehreren Schritten bestehenden OLE DB-Vorgang. Prfen Sie die einzelnen OLE DB-Statuswerte, falls vorhanden. Daten wurden nicht verarbeitet .'.
(SQL Server-Import/Export-Assistent)

Fehler 0xc0202025: Datenflusstask: Ein OLE DB-Accessor kann nicht erstellt werden. berprfen Sie, ob die Spaltenmetadaten gltig sind.
(SQL Server-Import/Export-Assistent)

Fehler 0xc004701a: Datenflusstask: Fehler in der Phase vor der Ausfhrung fr 'Komponente 'Ziel - TABELLE' (42)'. Fehlercode: 0xC0202025.
(SQL Server-Import/Export-Assistent)


durch das c&p fehlen öäü...
nahpets
nahpets 14.02.2008 um 15:21:31 Uhr
Goto Top
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