当前位置:首页 > 数据库 > Sqlserver

MSSQL 全文搜索 指定字符串

平时在在MSSql中查询数据的时候,想查找,某个字段在数据库中是否存在,并且查询出在哪个表中,哪个字段下面,在不知道的情况下,操作起来会很麻烦,然后就尝试些了一个sql语句,使用起来感觉挺方便的。当然了,也可以做成存储过程,来使用。

 

 

                --一般查询
DECLARE
@string VARCHAR(max) SET@string=‘七岁童年‘--要查询的字符串DECLARE@tbnameVARCHAR(50) DECLARE tbroy CURSORFORSELECT name FROM sysobjects WHERE xtype =‘u ‘--遍历所有的表OPEN tbroy FETCHnextFROM tbroy INTO@tbname--创建临时表IFObject_id(‘Tempdb..#temp_table‘) ISNOTNULLDROPTABLE #temp_table CREATETABLE #temp_table ( ID INTIDENTITY(1, 1), tbname VARCHAR(max),--表名 colname VARCHAR(max)--字段名 ) WHILE@@fetch_status=0BEGINDECLARE@colnameVARCHAR(50) DECLARE colroy CURSORFORSELECT name FROM syscolumns WHERE id =Object_id(@tbname) AND xtype IN (SELECT xtype FROM systypes WHERE name IN ( ‘varchar ‘, ‘nvarchar ‘, ‘char ‘, ‘nchar ‘ ) --数据类型为字符型的字段 ) --第二个游标是第一个游标的嵌套游标,遍历某个表的所有字段OPEN colroy FETCHnextFROM colroy INTO@colnameWHILE@@fetch_status=0BEGINDECLARE@sqlNVARCHAR(1000), @jINTSELECT@sql=‘select @i=count(1) from ‘+@tbname+‘ where ‘+@colname+‘ like ‘+‘‘‘%‘+@string+‘%‘‘‘EXEC Sp_executesql @sql, N‘@i int output‘, @i=@j output --输出满足条件表的记录数IF@j>0BEGININSERTINTO #temp_table SELECT@tbname, @colname--exec( ‘select distinct ‘+@colname+‘ from ‘ +@tbname + ‘ where ‘+ @colname+ ‘ like ‘+ ‘‘‘%‘+@string+ ‘%‘‘‘)ENDFETCHnextFROM colroy INTO@colnameENDCLOSE colroy DEALLOCATE colroy FETCHnextFROM tbroy INTO@tbnameENDCLOSE tbroy DEALLOCATE tbroy SELECT id, tbname as‘表名‘, colname as‘字段名‘FROM #temp_table IFObject_id(‘Tempdb..#temp_table‘) ISNOTNULL--删除临时表DROPTABLE #temp_table go

 

 

            --
            存储过程实现
            
--
            创建存储过程
            CREATE
            PROC Search (@stringNVARCHAR(max))
ASBEGINDECLARE@tbnameVARCHAR(50)
      DECLARE tbroy CURSORFORSELECT name
        FROM   sysobjects
        WHERE  xtype =‘u ‘--遍历所有的表OPEN tbroy

      FETCHnextFROM tbroy INTO@tbname--创建临时表IFObject_id(‘Tempdb..#temp_table‘) ISNOTNULLDROPTABLE #temp_table

      CREATETABLE #temp_table
        (
           ID      INTIDENTITY(1, 1),
           tbname  VARCHAR(max),--表名
           colname VARCHAR(max)--字段名        )

      WHILE@@fetch_status=0BEGINDECLARE@colnameVARCHAR(50)
            DECLARE colroy CURSORFORSELECT name
              FROM   syscolumns
              WHERE  id =Object_id(@tbname)
                     AND xtype IN (SELECT xtype
                                   FROM   systypes
                                   WHERE  name IN ( ‘varchar ‘, ‘nvarchar ‘, ‘char ‘, ‘nchar ‘ ) --数据类型为字符型的字段
                                  ) --第二个游标是第一个游标的嵌套游标,遍历某个表的所有字段OPEN colroy

            FETCHnextFROM colroy INTO@colnameWHILE@@fetch_status=0BEGINDECLARE@sqlNVARCHAR(1000),
                          @jINTSELECT@sql=‘select @i=count(1) from ‘+@tbname+‘ where ‘+@colname+‘ like ‘+‘‘‘%‘+@string+‘%‘‘‘EXEC Sp_executesql
                    @sql,
                    N‘@i int output‘,
                    @i=@j output --输出满足条件表的记录数IF@j>0BEGININSERTINTO #temp_table
                        SELECT@tbname,
                               @colname--exec( ‘select distinct ‘+@colname+‘ from ‘ +@tbname + ‘ where ‘+ @colname+ ‘ like ‘+ ‘‘‘%‘+@string+ ‘%‘‘‘)ENDFETCHnextFROM colroy INTO@colnameENDCLOSE colroy

            DEALLOCATE colroy

            FETCHnextFROM tbroy INTO@tbnameENDCLOSE tbroy

      DEALLOCATE tbroy

      SELECT id,
             tbname  AS‘表名‘,
             colname AS‘字段名‘FROM   #temp_table

      IFObject_id(‘Tempdb..#temp_table‘) ISNOTNULL--删除临时表DROPTABLE #temp_table
  ENDgo--使用方法EXEC Search ‘七岁童年‘

 

 

原文:http://www.cnblogs.com/simoncai/p/4383627.html


【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐