Ich habe ein großes Schema mit mehreren hundert Tabellen und mehrere tausend Spalten. Ich würde wissen, dass eine bestimmte IP-Adresse in dieser Datenbank an mehreren Stellen gespeichert ist, aber ich bin mir nicht sicher, in welcher (n) Tabelle (n) oder Spalte (n) sie gespeichert ist. Grundsätzlich versuche ich überall das zu finden Die IP-Adresse wird in der DB gespeichert, so dass ich sie an all diesen Stellen auf einen neuen Wert aktualisieren kann.Wie alle Textfelder in einem DB nach einem Teilstring mit T-SQL zu suchen
Hier ist mein erster Fehler bei einer T-SQL-Anweisung, den Tabellen- und Spaltennamen sowie den Wert für jede Textspalte in der Datenbank auszugeben, in der der Teilstring 10.15.13 enthalten ist.
Nun, das funktioniert, irgendwie. Das Problem ist, wenn ich es in Management Studio ausführe, der Aufruf von sp_executesql wird tatsächlich alle leeren Ergebnisse von jeder Abfrage zurückgeben, die nichts zurückgibt (dh die Spalte hat keine Datensätze mit diesem Teilstring), und es füllt das Ergebnisfenster bis zum Maximum, und dann sehe ich nicht wirklich, ob etwas gedruckt wurde.
Gibt es eine bessere Möglichkeit, diese Abfrage zu schreiben? Oder kann ich es auf eine andere Art und Weise ausführen, so dass es mir nur die Tabellen und Spalten zeigt, wo dieser Teilstring existiert?
DECLARE
@SchemaName VARCHAR(50),
@TableName VARCHAR(50),
@ColumnName VARCHAR(50);
BEGIN
DECLARE textColumns CURSOR FOR
SELECT s.Name, tab.Name, c.Name
FROM Sys.Columns c, Sys.Types t, Sys.Tables tab, Sys.Schemas s
WHERE s.schema_id = tab.schema_id AND tab.object_id = c.object_id AND c.user_type_id = t.user_type_id
AND t.Name in ('TEXT','NTEXT','VARCHAR','CHAR','NVARCHAR','NCHAR');
OPEN textColumns
FETCH NEXT FROM textColumns
INTO @SchemaName, @TableName, @ColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @sql NVARCHAR(MAX),
@ParamDef NVARCHAR(MAX),
@result NVARCHAR(MAX);
SET @sql = N'SELECT ' + @ColumnName + ' FROM ' + @SchemaName + '.' + @TableName + ' WHERE ' + @ColumnName + ' LIKE ''%10.15.13%''';
SET @ParamDef = N'@resultOut NVARCHAR(MAX) OUTPUT';
EXEC sp_executesql @sql, @ParamDef, @resultOut = @result OUTPUT;
PRINT 'Column = ' + @TableName + '.' + @ColumnName + ', Value = ' + @result;
FETCH NEXT FROM textColumns
INTO @SchemaName, @TableName, @ColumnName
END
CLOSE textColumns;
DEALLOCATE textColumns;
END
Ich mag würde Ergebnisse, so etwas sehen, wo es die Tabelle/Spalte zeigt, dass der Teil gefunden wurde, und den vollen Wert in dieser Spalte ...
Column = SomeTable.SomeTextColumn, Value = 'https://10.15.13.210/foo'
Column = SomeTable.SomeOtherColumn, Value = '10.15.13.210'
usw.
Ihre schließen. Vergleichen Sie Ihr Beispiel mit diesem Beispiel: [Einen String-Wert in allen Spalten einer SQL Server-Tabelle suchen und finden] (http://www.mssqltips.com/sqlservertip/1522/searching-and-finding-a-string-value-in -all-columns-in-einem-sql-server-table /) – Jeremy
Super Danke! Ich habe diese Lösung tatsächlich nicht von der Verknüpfung verwendet, da sie nur eine einzelne Tabelle durchsuchen kann, aber sie hatte eine andere Verknüpfung zu einer vollständigen Lösung zum Durchsuchen aller Tabellen in einer Datenbank. genau was ich brauchte. http://vyaskn.tripod.com/search_all_columns_in_all_tables.htm Bitte posten Sie dies als Antwort und ich werde es als korrekt markieren! – Jim
Ich habe die Antwort und den Link, auf den Sie sich bezogen haben, in die Nachwelt eingefügt. Vielen Dank! – Jeremy