Access
 sql >> Database >  >> RDS >> Access

Cerca nel database di Microsoft SQL Server i dati archiviati

Cerca nel database di Microsoft SQL Server i dati archiviati

Hai mai dovuto decifrare un database e identificare quale colonna contiene i dati di cui hai bisogno?

Di recente ho dovuto lavorare con l'estrazione di dati da un database SQL da utilizzare in Microsoft Access e Power BI, sfortunatamente la struttura dei nomi del database non era molto intuitiva.

L'unica guida che avevo era un rapporto che mostrava un esempio dei dati che dovevano essere estratti, con etichette che non avevano alcun riferimento ai nomi delle colonne. Ciò avrebbe potuto significare ore di lavoro alla ricerca del database e alla revisione di ogni tabella, questo particolare database aveva 288 tabelle.

Ho usato il codice in passato per cercare una colonna nelle tabelle, ma in questo caso non mi sarebbe d'aiuto.

Fortunatamente, mi sono imbattuto in un articolo molto interessante https://stackoverflow.com/questions/15757263/find-a-string-by-searching-all-tables-in-sql-server-management-studio-2008, questo è stato perfetto per le mie esigenze. Avevo semplicemente bisogno di impostare la variabile con il testo che stavo cercando ed eseguire il codice. In pochi secondi mi è stato fornito un elenco delle tabelle e delle colonne in cui è apparso il testo. In poco tempo ho avuto un elenco delle tabelle e delle colonne che dovevo includere nel mio progetto.

Si noti che questa soluzione si applica solo alle tabelle di SQL Server e viene eseguita in SQL Server Management Studio. È inoltre necessario disporre di un'istanza di SQL Server che supporti le variabili di tabella.

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

Spero che questo aiuti anche te!