Ho uno schema enorme, con diverse centinaia di tabelle e diverse migliaia di colonne. Saprei che un indirizzo IP specifico è memorizzato in questo database in diversi punti, ma non sono sicuro di quale tabella (s) o colonna (s) è memorizzato. Fondamentalmente, sto cercando di trovare ovunque che questo L'indirizzo IP è memorizzato nel DB in modo da poterlo aggiornare ad un nuovo valore in tutti questi posti.Come cercare tutti i campi di testo in un DB per alcune sottostringhe con T-SQL
Ecco il mio primo tentativo in un'istruzione T-SQL per stampare il nome di tabella e colonna e il valore, per ogni colonna di testo nel database che contiene la sottostringa 10.15.13.
Ora, questo funziona, una specie di. Il problema è che quando lo eseguo in Management Studio, la chiamata a sp_executesql restituirà effettivamente tutti i risultati vuoti da ogni query che non restituisce nulla (cioè la colonna non ha alcun record con quella sottostringa) e riempie la finestra dei risultati al suo massimo, e quindi in realtà non vedo se qualcosa è stato stampato.
C'è un modo migliore per scrivere questa query? O posso eseguirlo in un modo diverso in modo che solo mi mostra le tabelle e le colonne in cui questa sottostringa esiste?
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
mi piacerebbe vedere i risultati qualcosa come questo dove si mostra l'/ colonna della tabella che la stringa è stato trovato in, e il pieno valore in quella colonna ...
Column = SomeTable.SomeTextColumn, Value = 'https://10.15.13.210/foo'
Column = SomeTable.SomeOtherColumn, Value = '10.15.13.210'
etc.
Il tuo vicino. Confronta il tuo con questo esempio: [Ricerca e ricerca di un valore stringa in tutte le colonne in una tabella SQL Server] (http://www.mssqltips.com/sqlservertip/1522/searching-and-finding-a-string-value-in -all-columns-in-a-sql-server-table /) – Jeremy
Grazie fantastici! In realtà non ho usato questa soluzione dal collegamento perché è per cercare una singola tabella alla volta, ma aveva un altro collegamento a una soluzione completa per la ricerca di tutte le tabelle in un database; esattamente quello di cui avevo bisogno http://vyaskn.tripod.com/search_all_columns_in_all_tables.htm Per favore, postalo come risposta e lo contrassegnerò come corretto! – Jim
Ho incluso la risposta e il link a cui ti riferivi per i posteri. Grazie! – Jeremy