Hi
Ich hoffe ihr könnt mir helfen
Ich bin auf der Suche nach einer Abfrage die mir einen spezifischen Text in der gesamten Datenbank sucht.
Sprich: Ich möchte in jeder Spalte jeder Tabelle nach dem Suchbegriff suchen
Ich konnte leider im Netz nichts finden (da ich vermuttlich nach dem falschen Begriffen gesucht habe...) und daher selber eine Abfrage erstellt
CREATE PROCEDURE [dbo].[q_FeldinhaltSuchen]
@i_SucheNach varchar(255)
AS
DECLARE @ObjID int
DECLARE @Table varchar(50)
DECLARE @Column varchar(50)
DECLARE @PrimaryIDColumn varchar(50)
DECLARE @Search varchar(255)
DECLARE @cmd varchar(1024)
-- Temporäre Tabelle für die Rückgabe
CREATE Table #temp
(
varchar(50),
[Column] varchar(50)
)
-- Suchwert definieren (mit % für Wildcard-Suche)
SELECT @Search = '%' + @i_SucheNach + '%'
DECLARE FieldCursor CURSOR FOR (SELECT sys.tables.object_id, sys.tables.name, sys.columns.name FROM sys.columns
join sys.tables ON sys.tables.object_id = sys.columns.object_id
WHERE system_type_id IN (SELECT system_type_id FROM sys.types WHERE name in ('text', 'ntext', 'varchar', 'char', 'nvarchar', 'nchar')))
OPEN FieldCursor
FETCH NEXT FROM FieldCursor
INTO @ObjID, @Table, @Column
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @PrimaryIDColumn = ''
SELECT @PrimaryIDColumn = isnull(name, '') FROM sys.columns WHERE object_id = @ObjID AND is_identity = 1
-- Überprüfung des Inhalts, sofern Inhalt existiert, wird er in die temporäre Tabelle geschrieben
-- Sofern PrimaryID existiert, mit PrimaryID auf Existenz prüfen -> Abfragen sind schneller
IF @PrimaryIDColumn <> ''
SELECT @cmd = 'IF EXISTS(SELECT [' + @PrimaryIDColumn
ELSE
SELECT @cmd = 'IF EXISTS(SELECT [' + @Column
SELECT @cmd = @cmd + '] FROM [' + @Table + '] WHERE convert(varchar(50), [' + @Column + ']) LIKE ''' + @Search + ''') '
SELECT @cmd = @cmd + 'INSERT INTO #temp SELECT ''' + @Table + ''', ''' + @Column + ''''
-- Ausführen des Commands: () da der Command in einem String ist
print @cmd
EXEC (@cmd)
SELECT @ObjID = 0
SELECT @Table = '', @Column = ''
-- nächstes Objekt
FETCH NEXT FROM FieldCursor
INTO @ObjID, @Table, @Column
END
CLOSE FieldCursor
DEALLOCATE FieldCursor
-- Ausgabe der Tabelle
SELECT * FROM #temp
DELETE #temp
DROP TABLE #temp
Finish:
RETURN 0
GO
Ich konnte leider im Netz nichts finden (da ich vermuttlich nach dem falschen Begriffen gesucht habe...) und daher selber eine Abfrage erstellt
Ziemlich simpel
Eine Schlaufe durch alle Spalten
Pro Spalte wird ein String-Command erstellt welcher via IF Exist den Suchwert überprüft und sofern vorhanden die Spalte in eine temp. Tabelle (für die Ausgabe) schreibt.
Das funktioniert auch schön und gut
Problem ist: es ist langsam
Kennt ihr eine schnellere Lösung?
Das ermitteln des Primary Keys dient zB schon der Performance, und auch die Restriktion der Spalten (muss nicht nach dem Suchbegriff suchen, wenn die max-Länge der Spalte bereits kleiner ist).
Danke
Ich hoffe ihr könnt mir helfen
Ich bin auf der Suche nach einer Abfrage die mir einen spezifischen Text in der gesamten Datenbank sucht.
Sprich: Ich möchte in jeder Spalte jeder Tabelle nach dem Suchbegriff suchen
Ich konnte leider im Netz nichts finden (da ich vermuttlich nach dem falschen Begriffen gesucht habe...) und daher selber eine Abfrage erstellt
CREATE PROCEDURE [dbo].[q_FeldinhaltSuchen]
@i_SucheNach varchar(255)
AS
DECLARE @ObjID int
DECLARE @Table varchar(50)
DECLARE @Column varchar(50)
DECLARE @PrimaryIDColumn varchar(50)
DECLARE @Search varchar(255)
DECLARE @cmd varchar(1024)
-- Temporäre Tabelle für die Rückgabe
CREATE Table #temp
(
Ich konnte leider im Netz nichts finden (da ich vermuttlich nach dem falschen Begriffen gesucht habe...) und daher selber eine Abfrage erstellt
Ziemlich simpel
Eine Schlaufe durch alle Spalten
Pro Spalte wird ein String-Command erstellt welcher via IF Exist den Suchwert überprüft und sofern vorhanden die Spalte in eine temp. Tabelle (für die Ausgabe) schreibt.
Das funktioniert auch schön und gut
Problem ist: es ist langsam
Kennt ihr eine schnellere Lösung?
Das ermitteln des Primary Keys dient zB schon der Performance, und auch die Restriktion der Spalten (muss nicht nach dem Suchbegriff suchen, wenn die max-Länge der Spalte bereits kleiner ist).
Danke