Hallo zusammen
kent jemand den SQL String, mit dem ich in allen Tabellen nach einen Wert suchen kann.
Gruss aus CH
suchen nach Wert in allen Tabellen
Moderator: thorben.braun
- martin.koeditz
- Beiträge: 500
- Registriert: Sa 31. Mär 2018, 14:35
Hallo,
das ist prinzipiell über eine Prozedur möglich. Mit einem einfachen SQL-Statement kommst du da leider nicht weiter. Du musst die DDL-Struktur der Datenbank holen, also die Tabellen und zugehörigen Felder und in anschließend separaten Statements nach deinem Wert suchen. Vielleicht hat ja schon jemand ein passendes SQL-Konstrukt parat.
Gruß
Martin
das ist prinzipiell über eine Prozedur möglich. Mit einem einfachen SQL-Statement kommst du da leider nicht weiter. Du musst die DDL-Struktur der Datenbank holen, also die Tabellen und zugehörigen Felder und in anschließend separaten Statements nach deinem Wert suchen. Vielleicht hat ja schon jemand ein passendes SQL-Konstrukt parat.
Gruß
Martin
Martin Köditz
SynDesk SW GmbH
SynDesk SW GmbH
Das alleine reicht ja nicht aus, da ja auch in jeder Tabelle das/die Feld/er unterschiedlich sind.
Besser wäre, der Aufgabenstellung entsprechend, dies über einen Union-Select zu lösen:
select 'TableA' as Id, a.Feldx from TableA a where ....
union all
select 'TableB' as Id, a.Feldy from TableB a where ....
union all
select 'TableC' as Id, a.Feldz from TableC a where ....
:
:
Über das Feld "Id" weiß ich dann zumindest, wo die gelesenen Informationen herkommen, wenn es dann benötigt wird.
Besser wäre, der Aufgabenstellung entsprechend, dies über einen Union-Select zu lösen:
select 'TableA' as Id, a.Feldx from TableA a where ....
union all
select 'TableB' as Id, a.Feldy from TableB a where ....
union all
select 'TableC' as Id, a.Feldz from TableC a where ....
:
:
Über das Feld "Id" weiß ich dann zumindest, wo die gelesenen Informationen herkommen, wenn es dann benötigt wird.
- martin.koeditz
- Beiträge: 500
- Registriert: Sa 31. Mär 2018, 14:35
Ich hatte mal einen Ansatz gesehen in dem dynamisch eine VIEW generiert und dann abgefragt wird. Damit ist das Feld dann (fast) egal. Vielleicht finde ich das Konstrukt noch in den Untiefen meiner Festplatte.
Gruß
Martin
Gruß
Martin
Martin Köditz
SynDesk SW GmbH
SynDesk SW GmbH
- martin.koeditz
- Beiträge: 500
- Registriert: Sa 31. Mär 2018, 14:35
Guten Morgen,
ich habe folgende Lösung. Dabei werden alle Tabellen und deren Felder durchlaufen. Ausgegeben werden der Tabellenname, das Feld, die Anzahl der Treffer und, der Bequemlichkeit halber, das SQL-Statement für die spätere manuelle Abfrage.
Zunächst habe ich folgende selektierbare Prozedur:
Diese kann ich nun nach meinem Suchbegriff abfragen:
Nun werden mir alle Tabellen und deren Felder mit mindestens einem Treffer angezeigt.
Bitte beachtet, dass die Suche Groß- und Kleinschreibung unterscheided. Ggf. kann "LIKE" durch CONTAINING ersetzt werden. Dann wird die Groß- und Kleinschreibung ignoriert.
Ein weitere Punkt sind Probleme mit Sonderzeichen. Umlaute sollten vermieden werden, da diese, bedingt durch vorhandene Kodierungen, zu fehlern führen.
Ich hoffe, das hilft dem einen oder anderen weiter.
Gruß
Martin
ich habe folgende Lösung. Dabei werden alle Tabellen und deren Felder durchlaufen. Ausgegeben werden der Tabellenname, das Feld, die Anzahl der Treffer und, der Bequemlichkeit halber, das SQL-Statement für die spätere manuelle Abfrage.
Zunächst habe ich folgende selektierbare Prozedur:
Code: Alles auswählen
SET TERM ^^ ;
CREATE PROCEDURE PRC_FINDSTRINGINTABLE (
STRTOFIND VARCHAR(255)
)
RETURNS (
TABLENAME VARCHAR(31),
COLNAME VARCHAR(31),
OCCURENCE INT,
SQL_COMMAND VARCHAR(1000)
)
AS
DECLARE VARIABLE sqlCommandCount VARCHAR(1000);
DECLARE VARIABLE sqlCommandTmp VARCHAR(1000);
begin
-- Alle Tabellen durchlaufen
for select trim(rdb$relation_name)
from rdb$relations
where rdb$view_blr is null
and COALESCE(rdb$system_flag, 0) = 0
order by 1
into :TABLENAME
do
BEGIN
-- In jedem Feld der Tabelle nach dem Wert suchen.
for select trim(RDB$RELATION_FIELDS.rdb$field_name) as NC
from RDB$RELATION_FIELDS
where RDB$RELATION_FIELDS.rdb$relation_name = upper(:TABLENAME)
into :COLNAME
do begin
-- Anzeige des SQL-Befehls zur späteren Abfrage
SQL_COMMAND = 'SELECT * FROM ' || :TABLENAME || ' WHERE ' || :COLNAME || ' LIKE ''%' || :STRTOFIND || '%'';';
-- Anzahl der Zeilen abfragen
sqlCommandCount = 'SELECT
COUNT(*) as ANZAHL
FROM ' || :TABLENAME || ' WHERE ' || :COLNAME || ' LIKE ''%' || :STRTOFIND || '%'';';
EXECUTE STATEMENT sqlCommandCount
into :OCCURENCE;
-- Datenzeile ausgeben
SUSPEND;
end
END
end ^^
SET TERM ; ^^
Code: Alles auswählen
SELECT * FROM PRC_FINDSTRINGINTABLE('Braun')
WHERE OCCURENCE > 0;
Code: Alles auswählen
TABLENAME COLNAME OCCURENCE SQL_COMMAND
TBL_BUSINESS_ADDRESS ADDRESS_DISPLAY_NAME 56 SELECT * FROM TBL_BUSINESS_ADDRESS WHERE ADDRESS_DISPLAY_NAME LIKE '%Braun%';
TBL_BUSINESS_ADDRESS ADDRESS1 25 SELECT * FROM TBL_BUSINESS_ADDRESS WHERE ADDRESS1 LIKE '%Braun%';
TBL_BUSINESS_ADDRESS ADDRESS2 1 SELECT * FROM TBL_BUSINESS_ADDRESS WHERE ADDRESS2 LIKE '%Braun%';
Ein weitere Punkt sind Probleme mit Sonderzeichen. Umlaute sollten vermieden werden, da diese, bedingt durch vorhandene Kodierungen, zu fehlern führen.
Ich hoffe, das hilft dem einen oder anderen weiter.
Gruß
Martin
Martin Köditz
SynDesk SW GmbH
SynDesk SW GmbH