Mam ogromny schemat z kilkoma setkami tabel i kilkoma tysiącami kolumn. Wiedziałbym, że konkretny adres IP jest przechowywany w tej bazie danych w kilku miejscach, ale nie jestem pewien, w której tabeli lub kolumnach jest przechowywany. Zasadniczo, staram się znaleźć wszędzie, że to Adres IP jest przechowywany w DB, więc mogę zaktualizować go do nowej wartości we wszystkich tych miejscach.Jak przeszukać wszystkie pola tekstowe w bazie danych dla niektórych podłańcuchów przy pomocy T-SQL
Oto moje pierwsze pęknięcie w instrukcji T-SQL, aby wydrukować nazwę tabeli i kolumny oraz wartość dla każdej kolumny tekstowej w bazie danych zawierającej podciąg 10.15.13.
To działa, w pewnym sensie. Problem polega na tym, że gdy wykonuję go w Management Studio, wywołanie sp_executesql spowoduje zwrócenie wszystkich pustych wyników z każdego zapytania, które niczego nie zwróci (tj. Kolumna nie ma żadnych rekordów z tym podciąganiem) i wypełnia okno wyników na maksa, a potem nie widzę, czy coś zostało wydrukowane.
Czy istnieje lepszy sposób napisania tego zapytania? Czy mogę uruchomić go w inny sposób, tak aby pokazywał mi tylko tabele i kolumny, w których ten podciąg?
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
Chciałbym zobaczyć wyniki coś takiego, gdzie pokazuje tabela/kolumnę że podciąg było znaleźć, i pełną wartość w tej kolumnie ...
Column = SomeTable.SomeTextColumn, Value = 'https://10.15.13.210/foo'
Column = SomeTable.SomeOtherColumn, Value = '10.15.13.210'
etc.
Twoje zamknięcie. Porównaj swoje z tym przykładem: [Wyszukiwanie i znajdowanie wartości ciągu we wszystkich kolumnach tabeli SQL Server] (http://www.mssqltips.com/sqlservertip/1522/searching-and-finding-a-string-value-in -all-columns-in-a-sql-server-table /) – Jeremy
Niesamowite dzięki! Właściwie nie użyłem tego rozwiązania z linku, ponieważ służy ono do przeszukiwania pojedynczej tabeli na raz, ale miało inne łącze do kompletnego rozwiązania do przeszukiwania wszystkich tabel w bazie danych; dokładnie to, czego potrzebowałem. http://vyaskn.tripod.com/search_all_columns_in_all_tables.htm Proszę zaksięgować to jako odpowiedź, a ja oznaczyłem to jako poprawne! – Jim
Dołączyłem odpowiedź, a także link, do którego odnosiłeś się w odniesieniu do potomności. Dzięki! – Jeremy