OVH Cloud OVH Cloud

recherche multichamp et multi table

2 réponses
Avatar
pascal
Bonjour,
Est ce possible de recherche un texte dans toute la base de donnée.
Merci.

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net

2 réponses

Avatar
Fred BROUARD
/*---------------------------------------------------
| recherche d'une occurrence de mot dans n'importe |
| quelle colonne de type caractères de n'importe |
| quelle table de la base de données |
|----------------------------------------------------- |
| Frédéric BROUARD - DATA SAPIENS - 2001-12-18 |
-------------------------------------------------- */

CREATE PROCEDURE SP_SEARCH_STRING_ANYFIELD_ANYTABLE
@SearchWord Varchar(32) -- mot recherché
AS

DECLARE @ErrMsg VARCHAR(128)

-- effet de bord 1 : pas de mot passé
IF @SearchWord IS NULL
BEGIN
SET @ErrMsg = 'Impossible de traiter cette recherche avec un argument NULL'
GOTO LBL_ERROR
END

-- effet de bord 2 : mot vide passé
IF @SearchWord = ''
BEGIN
SET @ErrMsg = 'Impossible de traiter cette recherche avec un argument vide'
GOTO LBL_ERROR
END

-- effet de bord 3 : mot contenant un caractère joker % du LIKE
IF CHARINDEX('%', @SearchWord) > 0
BEGIN
SET @ErrMsg = 'Impossible de traiter cette recherche avec un argument
contenant un caractère %'
GOTO LBL_ERROR
END

-- effet de bord 4 : mot contenant un caractère joker _ du LIKE
IF CHARINDEX('_', @SearchWord) > 0
BEGIN
SET @ErrMsg = 'Impossible de traiter cette recherche avec un argument
contenant un caractère _'
GOTO LBL_ERROR
END

-- variables de travail
DECLARE @TableName VARCHAR(128), -- nom de la table passé en argument
@ColumnList1 VARCHAR(2000),-- liste des colonnes pour clause SELECT
@ColumnList2 VARCHAR(2000),-- liste des colonnes pour clause WHERE
@SQL VARCHAR(5000) -- requête dynamique

-- curseur parcourant toutes les tables
DECLARE CurTables CURSOR
FOR
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.tables
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME IS NOT NULL
-- en cas d'erreur
IF @@Error <> 0
BEGIN
SET @ErrMsg = 'Erreur dans la recherche de la lsite des tables concernées'
GOTO LBL_ERROR
END

-- ouverture du cuseur
OPEN CurTables

-- lecture de la première ligne de l'ensemble de résultat
FETCH CurTables INTO @TableName

-- la lecture est-elle correcte ? Oui, on boucle !
WHILE @@Fetch_Status = 0
BEGIN

-- les variables contenant les listes des colonnes sont initialisée à vide
SET @ColumnList1 = ''
SET @ColumnList2 = ''

-- construction des listes
SELECT @ColumnList1 = @ColumnList1 + COLUMN_NAME+', ',
@ColumnList2 = @ColumnList2 + 'COALESCE('+COLUMN_NAME+', '''') + '
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @tableName
AND DATA_TYPE LIKE '%char%'

-- pas de colonnes cible pour la recherche, on lit l'enregistrement suivant et
on boucle
IF @ColumnList1 = ''
BEGIN
FETCH CurTables INTO @TableName
CONTINUE
END

-- suppression du dernier caractère parasite des listes de colonne
SET @ColumnList1 = SUBSTRING(@ColumnList1, 1, LEN(@ColumnList1) - 1)
SET @ColumnList2 = SUBSTRING(@ColumnList2, 1, LEN(@ColumnList2) - 1)

-- création de la requête de recherche de l'ensemble des occurences
SET @SQL = 'SELECT ' +@ColumnList1
+' FROM ' +@TableName
+' WHERE ' +@ColumnList2
+' LIKE ''%'+@SearchWord+'%'''

-- exécution de la requête de recherche des occurences
EXEC(@SQL)

-- lecture de la ligne suivante
FETCH CurTables INTO @TableName
END

-- fermeture du curseur
CLOSE CurTables

-- libération de l'espace mémoire
DEALLOCATE CurTables

PRINT '*** RECHERCHE de l''occurence '+@SearchWord+ ' dans toute la base
terminée ***'

RETURN

-- gestion des erreurs
LBL_ERROR:
RAISERROR (@ErrMsg, 16, 1)

GO

pascal a écrit:
Bonjour,
Est ce possible de recherche un texte dans toute la base de donnée.
Merci.




--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
pascal
Super
Et en plus ca marche ! ;)
Merci

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net