Access
 sql >> Datenbank >  >> RDS >> Access

Durchsuchen Sie die Microsoft SQL Server-Datenbank nach gespeicherten Daten

Microsoft SQL Server-Datenbank nach gespeicherten Daten durchsuchen

Mussten Sie jemals eine Datenbank entschlüsseln und feststellen, welche Spalte die benötigten Daten enthält?

Ich musste kürzlich mit dem Extrahieren von Daten aus einer SQL-Datenbank arbeiten, um sie in Microsoft Access und Power BI zu verwenden, leider war die Namensstruktur der Datenbank nicht sehr intuitiv.

Die einzige Anleitung, die ich hatte, war ein Bericht, der ein Beispiel der zu extrahierenden Daten zeigte, mit Beschriftungen, die keinen Bezug zu den Spaltennamen hatten. Dies hätte stundenlange Arbeit bedeuten können, die Datenbank zu durchsuchen und jede Tabelle zu überprüfen, diese spezielle Datenbank hatte 288 Tabellen.

Ich habe in der Vergangenheit Code verwendet, um nach einer Spalte in Tabellen zu suchen, aber in diesem Fall würde mir das nicht helfen.

Glücklicherweise stieß ich auf einen sehr interessanten Artikel https://stackoverflow.com/questions/15757263/find-a-string-by-searching-all-tables-in-sql-server-management-studio-2008, das war perfekt für meine Bedürfnisse. Ich musste einfach die Variable mit dem gesuchten Text setzen und den Code ausführen. Innerhalb von Sekunden erhielt ich eine Liste der Tabellen und Spalten, in denen der Text erschien. Bald hatte ich eine Liste der Tabellen und Spalten, die ich in mein Projekt aufnehmen musste.

Bitte beachten Sie, dass diese Lösung nur für SQL Server-Tabellen gilt und in SQL Server Management Studio ausgeführt wird. Außerdem benötigen Sie eine SQL Server-Instanz, die Tabellenvariablen unterstützt.

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

Ich hoffe, das hilft dir auch!