Zoeken in Microsoft SQL Server-database naar opgeslagen gegevens
Heb je ooit een database moeten ontcijferen en bepalen in welke kolom de gegevens staan die je nodig hebt?
Ik moest onlangs werken met het extraheren van gegevens uit een SQL-database om te gebruiken in Microsoft Access en Power BI, helaas was de naamgevingsstructuur van de database niet erg intuïtief.
De enige gids die ik had, was een rapport met een voorbeeld van de gegevens die moesten worden geëxtraheerd, met labels die geen verwijzing hadden naar de kolomnamen. Dit had uren werk kunnen betekenen door de database te doorzoeken en elke tabel te bekijken, deze specifieke database had 288 tabellen.
Ik heb in het verleden code gebruikt om naar een kolom in tabellen te zoeken, maar in dit geval zou dat me niet helpen.
Gelukkig kwam ik een heel interessant artikel tegen https://stackoverflow.com/questions/15757263/find-a-string-by-searching-all-tables-in-sql-server-management-studio-2008, dit was perfect voor mijn behoeften. Ik hoefde alleen maar de variabele in te stellen met de tekst die ik zocht en de code uit te voeren. Binnen enkele seconden kreeg ik een lijst met de tabellen en kolommen waar de tekst verscheen. Het duurde niet lang of ik had een lijst met tabellen en kolommen die ik in mijn project moest opnemen.
Let op:deze oplossing is alleen van toepassing op SQL Server-tabellen en wordt uitgevoerd in SQL Server Management Studio. U moet ook een SQL Server-instantie hebben die tabelvariabelen ondersteunt.
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 Ik hoop dat dit jou ook helpt!