sql >> Databasteknik >  >> RDS >> Access

Sök i Microsoft SQL Server Database efter lagrad data

Sök efter lagrad data i Microsoft SQL Server-databas

Har du någonsin behövt dechiffrera en databas och identifiera vilken kolumn som har de data du behöver?

Jag var nyligen tvungen att arbeta med att extrahera data från en SQL-databas för att använda i Microsoft Access och Power BI, tyvärr var databasens namnstruktur inte särskilt intuitiv.

Den enda guiden jag hade var en rapport som visade ett exempel på data som behövde extraheras, med etiketter som inte hade någon hänvisning till kolumnnamnen. Detta kunde ha inneburit timmar av arbete med att söka i databasen och granska varje tabell, just den här databasen hade 288 tabeller.

Jag har använt kod tidigare för att söka efter en kolumn i tabeller, men i det här fallet skulle det inte hjälpa mig.

Lyckligtvis kom jag över en mycket intressant artikel https://stackoverflow.com/questions/15757263/find-a-string-by-searching-all-tables-in-sql-server-management-studio-2008, detta var perfekt för mina behov. Jag behövde helt enkelt ställa in variabeln med texten jag letade efter och köra koden. På några sekunder fick jag en lista över de tabeller och kolumner där texten förekom. Snart hade jag en lista över de tabeller och kolumner som jag behövde inkludera i mitt projekt.

Observera att denna lösning endast gäller SQL Server-tabeller och körs i SQL Server Management Studio. Du måste också ha en SQL Server-instans som stöder tabellvariabler.

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

Jag hoppas att detta hjälper dig också!


  1. Använda MariaDB Flashback på en MySQL-server

  2. MySQL – MariaDB – Skriver den allra första lagrade proceduren

  3. Det snabbaste sättet att kontrollera om några poster i en databastabell?

  4. MySQL #1140 - Blandning av GROUP-kolumner