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!