Magazine Internet

Recherche du texte dans une base de données

Publié le 05 mai 2009 par Olivier Moreau

Voila une procédure stockée trouvé sur le site de Narayana Vyas Kondreddi et qui permet de retrouver un mot ou un ensemble de mots dans une base de données SQL Server.

La procédure stockée renvoi les informations dans un tableau à deux colonnes :

  • 1ère colonne : nom de la table et nom de la colonne
  • 2ème colonne : valeur trouvée

La procédure stockée s'utilise ainsi

exec SearchAllTables 'MOT_A_RECHERCHER'

et voila le code de la procédure stockée :

CREATE PROC SearchAllTables
(
 @SearchStr nvarchar(100)
)
AS
BEGIN
 
 -- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.
 -- Purpose: To search all columns of all tables for a given search string
 -- Written by: Narayana Vyas Kondreddi
 -- Site: <a href="http://vyaskn.tripod.com">http://vyaskn.tripod.com
</a> -- Tested on: SQL Server 7.0 and SQL Server 2000
 -- Date modified: 28th July 2002 22:50 GMT
 
 CREATE TABLE #Results (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')
  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 DISTINCT ColumnName, ColumnValue FROM #Results
END

Retour à La Une de Logo Paperblog