Microsoft SQL Server-Datenbank nach gespeicherten Daten durchsuchen
Mussten Sie jemals eine Datenbank entschlüsseln und feststellen, welche Spalte die benötigten Daten enthält?
Ich musste kürzlich mit dem Extrahieren von Daten aus einer SQL-Datenbank arbeiten, um sie in Microsoft Access und Power BI zu verwenden, leider war die Namensstruktur der Datenbank nicht sehr intuitiv.
Die einzige Anleitung, die ich hatte, war ein Bericht, der ein Beispiel der zu extrahierenden Daten zeigte, mit Beschriftungen, die keinen Bezug zu den Spaltennamen hatten. Dies hätte stundenlange Arbeit bedeuten können, die Datenbank zu durchsuchen und jede Tabelle zu überprüfen, diese spezielle Datenbank hatte 288 Tabellen.
Ich habe in der Vergangenheit Code verwendet, um nach einer Spalte in Tabellen zu suchen, aber in diesem Fall würde mir das nicht helfen.
Glücklicherweise stieß ich auf einen sehr interessanten Artikel https://stackoverflow.com/questions/15757263/find-a-string-by-searching-all-tables-in-sql-server-management-studio-2008, das war perfekt für meine Bedürfnisse. Ich musste einfach die Variable mit dem gesuchten Text setzen und den Code ausführen. Innerhalb von Sekunden erhielt ich eine Liste der Tabellen und Spalten, in denen der Text erschien. Bald hatte ich eine Liste der Tabellen und Spalten, die ich in mein Projekt aufnehmen musste.
Bitte beachten Sie, dass diese Lösung nur für SQL Server-Tabellen gilt und in SQL Server Management Studio ausgeführt wird. Außerdem benötigen Sie eine SQL Server-Instanz, die Tabellenvariablen unterstützt.
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
Ich hoffe, das hilft dir auch!