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!