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

Søg i Microsoft SQL Server-databasen efter lagrede data

Søg i Microsoft SQL Server-databasen efter lagrede data

Har du nogensinde skullet dechifrere en database og identificere, hvilken kolonne der har de data, du har brug for?

Jeg har for nylig skullet arbejde med at udtrække data fra en SQL-database til brug i Microsoft Access og Power BI, desværre var databasens navngivningsstruktur ikke særlig intuitiv.

Den eneste vejledning, jeg havde, var en rapport, der viste et eksempel på de data, der skulle udtrækkes, med etiketter, der ikke havde nogen reference til kolonnenavnene. Dette kunne have betydet timers arbejde med at søge i databasen og gennemgå hver tabel, denne særlige database havde 288 tabeller.

Jeg har tidligere brugt kode til at søge efter en kolonne i tabeller, men i dette tilfælde ville det ikke hjælpe mig.

Heldigvis stødte jeg på en meget interessant artikel https://stackoverflow.com/questions/15757263/find-a-string-by-searching-all-tables-in-sql-server-management-studio-2008, denne var perfekt til mine behov. Jeg skulle simpelthen indstille variablen med den tekst, jeg ledte efter, og køre koden. I løbet af få sekunder fik jeg en liste over de tabeller og kolonner, hvor teksten optrådte. Inden længe havde jeg en liste over de tabeller og kolonner, som jeg skulle inkludere i mit projekt.

Bemærk venligst, at denne løsning kun gælder for SQL Server-tabeller og køres i SQL Server Management Studio. Du skal også have en SQL Server-instans, der understøtter tabelvariabler.

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

Jeg håber, at dette også hjælper dig!


  1. MySQL varchar indekslængde

  2. Sådan konverteres en streng til store bogstaver i SQL

  3. Hvordan kontrolleres resultaterne af SSIS-pakkejob, efter at den har fuldført sin udførelse?

  4. Konverter Unixtime til Datetime SQL (Oracle)