¿Alguna vez ha tenido que descifrar una base de datos e identificar qué columna tiene los datos que necesita?

Recientemente tuve que trabajar con la extracción de datos de una base de datos SQL para usar en Microsoft Access y Power Bi, desafortunadamente la estructura de nombres de la base de datos no era muy intuitiva.

La única guía que tenía era un informe que mostraba un ejemplo de los datos que debían extraerse, con etiquetas que no tenían referencia a los nombres de las columnas. Esto podría haber significado horas de trabajo buscando en la base de datos y revisando cada tabla, esta base de datos en particular tenía 288 tablas.

He usado código en el pasado para buscar una columna en tablas, pero en este caso eso no me ayudaría.

Afortunadamente, me encontré con un artículo muy interesante https://stackoverflow.com/questions/15757263/find-a-string-by-searching-all-tables-in-sql-server-management-studio-2008, esto fue perfecto para mis necesidades Simplemente necesitaba establecer la variable con el texto que estaba buscando y ejecutar el código. En cuestión de segundos recibí una lista de las tablas y columnas donde apareció el texto. En poco tiempo tenía una lista de las tablas y columnas que necesitaba incluir en mi proyecto.

Tenga en cuenta que esta solución se aplica solo a las tablas de SQL Server y se ejecuta en SQL Server Management Studio. También debe tener una instancia de SQL Server que admita variables de tabla.

USE DATABASE_NAME
DECLARE @SearchStr nvarchar(100) = 'SEARCH_TEXT'
DECLARE @Results TABLE (ColumnName nvarchar(370), ColumnValue nvarchar(3630))
SET NOCOUNT ON
DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET  @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
WHILE @TableName IS NOT NULL
BEGIN
    SET @ColumnName = ''
    SET @TableName = 
    (
        SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
        FROM     INFORMATION_SCHEMA.TABLES
        WHERE         TABLE_TYPE = 'BASE TABLE'
            AND    QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
            AND    OBJECTPROPERTY(
                    OBJECT_ID(
                        QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                         ), 'IsMSShipped'
                           ) = 0
    )
    WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
    BEGIN
        SET @ColumnName =
        (
            SELECT MIN(QUOTENAME(COLUMN_NAME))
            FROM     INFORMATION_SCHEMA.COLUMNS
            WHERE         TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                AND    TABLE_NAME    = PARSENAME(@TableName, 1)
                AND    DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'int', 'decimal')
                AND    QUOTENAME(COLUMN_NAME) > @ColumnName
        )
        IF @ColumnName IS NOT NULL
        BEGIN
            INSERT INTO @Results
            EXEC
            (
                'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) 
                FROM ' + @TableName + ' (NOLOCK) ' +
                ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
            )
        END
    END    
END
SELECT ColumnName, ColumnValue FROM @Results

¡Espero que esto también te ayude!