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!