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å!