sql >> Database >  >> RDS >> Access

Zoeken in Microsoft SQL Server-database naar opgeslagen gegevens

Zoeken in Microsoft SQL Server-database naar opgeslagen gegevens

Heb je ooit een database moeten ontcijferen en bepalen in welke kolom de gegevens staan ​​die je nodig hebt?

Ik moest onlangs werken met het extraheren van gegevens uit een SQL-database om te gebruiken in Microsoft Access en Power BI, helaas was de naamgevingsstructuur van de database niet erg intuïtief.

De enige gids die ik had, was een rapport met een voorbeeld van de gegevens die moesten worden geëxtraheerd, met labels die geen verwijzing hadden naar de kolomnamen. Dit had uren werk kunnen betekenen door de database te doorzoeken en elke tabel te bekijken, deze specifieke database had 288 tabellen.

Ik heb in het verleden code gebruikt om naar een kolom in tabellen te zoeken, maar in dit geval zou dat me niet helpen.

Gelukkig kwam ik een heel interessant artikel tegen https://stackoverflow.com/questions/15757263/find-a-string-by-searching-all-tables-in-sql-server-management-studio-2008, dit was perfect voor mijn behoeften. Ik hoefde alleen maar de variabele in te stellen met de tekst die ik zocht en de code uit te voeren. Binnen enkele seconden kreeg ik een lijst met de tabellen en kolommen waar de tekst verscheen. Het duurde niet lang of ik had een lijst met tabellen en kolommen die ik in mijn project moest opnemen.

Let op:deze oplossing is alleen van toepassing op SQL Server-tabellen en wordt uitgevoerd in SQL Server Management Studio. U moet ook een SQL Server-instantie hebben die tabelvariabelen ondersteunt.

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

Ik hoop dat dit jou ook helpt!


  1. Oracle-datumverschil om het aantal jaren te krijgen

  2. Waarschuwing:mysql_connect():[2002] Geen dergelijk bestand of map (probeert verbinding te maken via unix:///tmp/mysql.sock) in

  3. Hoe de functie, procedure, triggers-broncode in postgresql weer te geven?

  4. DATE formatteren in orakel