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 !