1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
| 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%'
-- HM 31/05/2012 : Nouveau bloc T-SQL ajouté Début...
SELECT @ColumnList1 = @ColumnList1 + COLUMN_NAME+', ',
@ColumnList2 = @ColumnList2 + 'COALESCE(CONVERT(VARCHAR,'+ COLUMN_NAME+', 103), '''')+'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @tableName
AND DATA_TYPE = 'DATETIME'
-- HM 31/05/2012 : Nouveau bloc T-SQL ajouté ...Fin
-- 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 -- HM 31/05/2012 : Ligne mise en commentaire
SET @SQL = 'SELECT ' +''''+@TableName + ''' AS TABLE_NAME,'+@ColumnList1 -- HM 31/05/2012 ligne de remplacement
+' 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) |
Partager