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: 523
 - 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: 523
 - 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: 523
 - 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