Tengo un gran esquema, con varios cientos de tablas y varios miles de columnas. Sé que una dirección IP específica está almacenada en esta base de datos en varios lugares, pero no estoy seguro de qué tabla (s) o columna (s) está almacenada. Básicamente, estoy tratando de encontrar en todas partes que esto La dirección IP se almacena en la base de datos para que pueda actualizarla a un nuevo valor en todos esos lugares.Cómo buscar todos los campos de texto en una base de datos para alguna subcadena con T-SQL
Aquí está mi primera grieta en una declaración de T-SQL para imprimir el nombre de la tabla y columna, y el valor, para cada columna de texto en la base de datos que tiene la subcadena 10.15.13.
Ahora, esto funciona, más o menos. El problema es que cuando lo ejecuto en Management Studio, la llamada a sp_executesql realmente devolverá todos los resultados vacíos de cada consulta que no devuelve nada (es decir, la columna no tiene ningún registro con esa subcadena), y llena la ventana de resultados al máximo, y luego realmente no veo si se imprimió algo.
¿Existe una forma mejor de escribir esta consulta? ¿O puedo ejecutarlo de otra manera para que solo me muestre las Tablas y Columnas donde esta subcadena existe?
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
me gustaría ver resultados algo como esto donde se muestra la tabla/columna que la subcadena se encuentra en, y el valor total de esa columna ...
Column = SomeTable.SomeTextColumn, Value = 'https://10.15.13.210/foo'
Column = SomeTable.SomeOtherColumn, Value = '10.15.13.210'
etc.
Su cierre. Compare el suyo con este ejemplo: [Búsqueda y búsqueda de un valor de cadena en todas las columnas en una tabla de SQL Server] (http://www.mssqltips.com/sqlservertip/1522/searching-and-finding-a-string-value-in -all-columns-in-a-sql-server-table /) – Jeremy
¡Gracias increíbles! De hecho, no utilicé esa solución del enlace porque es para buscar una sola tabla a la vez, pero tenía otro enlace a una solución completa para buscar todas las tablas en una base de datos; exactamente lo que necesitaba http://vyaskn.tripod.com/search_all_columns_in_all_tables.htm ¡Publique esto como respuesta y lo marcaré como correcto! – Jim
He incluido la respuesta y el enlace al que se refería para la posteridad. ¡Gracias! – Jeremy