sql >> Base de Datos >  >> RDS >> Access

Buscar datos almacenados en la base de datos de Microsoft SQL Server

Buscar datos almacenados en la base de datos de Microsoft SQL Server

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

Recientemente tuve que trabajar extrayendo datos de una base de datos SQL para usar en Microsoft Access y Power BI, lamentablemente 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 hací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 las tablas, pero en este caso eso no me ayudaría.

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

Tenga en cuenta que esta solución solo se aplica a las tablas de SQL Server y se ejecuta en SQL Server Management Studio. También necesita 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!