Rechercher dans la base de données Microsoft SQL Server pour les données stockées
Avez-vous déjà dû déchiffrer une base de données et identifier quelle colonne contient les données dont vous avez besoin ?
J'ai récemment dû travailler avec l'extraction de données d'une base de données SQL à utiliser dans Microsoft Access et Power BI, malheureusement la structure de nommage de la base de données n'était pas très intuitive.
Le seul guide que j'avais était un rapport montrant un exemple des données qui devaient être extraites, avec des étiquettes qui n'avaient aucune référence aux noms de colonne. Cela aurait pu signifier des heures de travail à chercher dans la base de données et à examiner chaque table, cette base de données particulière comportait 288 tables.
J'ai utilisé du code dans le passé pour rechercher une colonne dans des tableaux, mais dans ce cas, cela ne m'aiderait pas.
Heureusement, je suis tombé sur un article très intéressant https://stackoverflow.com/questions/15757263/find-a-string-by-searching-all-tables-in-sql-server-management-studio-2008, c'était parfait pour mes besoins. J'avais simplement besoin de définir la variable avec le texte que je cherchais et d'exécuter le code. En quelques secondes, on m'a fourni une liste des tableaux et des colonnes où le texte apparaissait. En peu de temps, j'ai eu une liste des tables et des colonnes que je devais inclure dans mon projet.
Veuillez noter que cette solution s'applique uniquement aux tables SQL Server et est exécutée dans SQL Server Management Studio. Vous devez également disposer d'une instance SQL Server qui prend en charge les variables de table.
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
J'espère que cela vous aidera aussi !