Access
 sql >> Base de Dados >  >> RDS >> Access

Pesquisar banco de dados do Microsoft SQL Server para dados armazenados

Pesquisar dados armazenados no banco de dados do Microsoft SQL Server




Você já precisou decifrar um banco de dados e identificar qual coluna possui os dados que você precisa?

Recentemente tive que trabalhar com extração de dados de um banco de dados SQL para usar no Microsoft Access e Power BI, infelizmente a estrutura de nomenclatura do banco de dados não era muito intuitiva.

O único guia que eu tinha era um relatório mostrando um exemplo dos dados que precisavam ser extraídos, com rótulos que não tinham referência aos nomes das colunas. Isso poderia significar horas de trabalho pesquisando o banco de dados e revisando cada tabela, esse banco de dados em particular tinha 288 tabelas.

Eu usei código no passado para procurar uma coluna em tabelas, mas neste caso isso não me ajudaria.

Felizmente, me deparei com um artigo muito interessante https://stackoverflow.com/questions/15757263/find-a-string-by-searching-all-tables-in-sql-server-management-studio-2008, isso foi perfeito para minhas necessidades. Eu simplesmente precisava definir a variável com o texto que estava procurando e executar o código. Em questão de segundos, recebi uma lista das tabelas e colunas onde o texto aparecia. Em pouco tempo, eu tinha uma lista das tabelas e colunas que precisava incluir no meu projeto.

Observe que esta solução se aplica apenas a tabelas do SQL Server e é executada no SQL Server Management Studio. Você também precisa ter uma instância do SQL Server que dê suporte a variáveis ​​de tabela.
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 isso ajude você também!