Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 212
  • Last Modified:

SQL query that returns records with 'mytext' found in any column?

Is there a way to build a query that will return all records with a specified text found in any of the  columns?

I'm trying to implement a global seach on our database for when a keyword is known but the correct column is not known.

If not . . . . how would I go about building a stored procedure that does this?

Thanks!
0
lthames
Asked:
lthames
  • 2
  • 2
  • 2
1 Solution
 
BrandonGalderisiCommented:
That's been done and here's a link to one version of it.

I googled "sql search all tables" and that's the first hit.  Run the same search and you'll get more.

http://vyaskn.tripod.com/search_all_columns_in_all_tables.htm
0
 
Jagdish DevakuSr DB ArchitectCommented:
hey

please check modified query in the above link posted by brandon...

DECLARE @SearchStr nvarchar(100)   
   SET @SearchStr = 'television'  
     
   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',  'numeric','decimal', 'double', 'money')  
                           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  
  
DROP TABLE #Results

Open in new window

0
 
lthamesAuthor Commented:
This is a good start . . .but I only want to search all columns of ONE table (basically a support issue table and I don't know if the keyword will be in the subject, body, module name, contract number, etc.)

I think I can take the above procedure and modify it to work with just one table, but I would like to make sure there isn't a better way to do it if I only need results from one table.

0
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 
Jagdish DevakuSr DB ArchitectCommented:
Check the below code which might meet your requirement...
please let me know if there is any issue as I have not executed it...

DECLARE @SearchStr nvarchar(100), @TableName nvarchar(256)   
   SET @SearchStr = 'television'
   SET @TableName = 'Emp'
     
   CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))  
  
   SET NOCOUNT ON  
   DECLARE @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)  
  
   SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')  
  
  
     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',  'numeric','decimal', 'double', 'money')  
                           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     
   
 SELECT distinct ColumnName, ColumnValue FROM #Results  
  
DROP TABLE #Results

Open in new window

0
 
BrandonGalderisiCommented:
If it's just one table, and you only have 4 columns, then just write a simple query.



select * from SomeTable
where subject like '%SomeText%'
or body like '%SomeText%'
or modulename like '%SomeText%'
or contractnumber like '%SomeText%'

Open in new window

0
 
lthamesAuthor Commented:
This is exactly what I needed.  I had way more than 4 columns . . but I just added all of the columns and built the query in my program.

Thanks!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 2
  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now