zoukankan      html  css  js  c++  java
  • MSSQL 全库搜索 指定字符串

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

        

    --一般查询

    DECLARE
    @string VARCHAR(max) SET @string='a'--要查询的字符串 DECLARE @tbname VARCHAR(50) DECLARE tbroy CURSOR FOR SELECT name FROM sysobjects WHERE xtype = 'u ' --遍历所有的表 OPEN tbroy FETCH next FROM tbroy INTO @tbname --创建临时表 IF Object_id('Tempdb..#temp_table') IS NOT NULL DROP TABLE #temp_table CREATE TABLE #temp_table ( ID INT IDENTITY(1, 1), tbname VARCHAR(max),--表名 colname VARCHAR(max)--字段名 ) WHILE @@fetch_status = 0 BEGIN DECLARE @colname VARCHAR(50) DECLARE colroy CURSOR FOR SELECT name FROM syscolumns WHERE id = Object_id(@tbname) AND xtype IN (SELECT xtype FROM systypes WHERE name IN ( 'varchar ', 'nvarchar ', 'char ', 'nchar ' ) --数据类型为字符型的字段 ) --第二个游标是第一个游标的嵌套游标,遍历某个表的所有字段 OPEN colroy FETCH next FROM colroy INTO @colname WHILE @@fetch_status = 0 BEGIN DECLARE @sql NVARCHAR(1000), @j INT SELECT @sql = 'select @i=count(1) from ' + @tbname + ' where ' + @colname + ' like ' + '''%' + @string + '%''' EXEC Sp_executesql @sql, N'@i int output', @i=@j output --输出满足条件表的记录数 IF @j > 0 BEGIN INSERT INTO #temp_table SELECT @tbname, @colname --exec( 'select distinct '+@colname+' from ' +@tbname + ' where '+ @colname+ ' like '+ '''%'+@string+ '%''') END FETCH next FROM colroy INTO @colname END CLOSE colroy DEALLOCATE colroy FETCH next FROM tbroy INTO @tbname END CLOSE tbroy DEALLOCATE tbroy SELECT id, tbname as '表名', colname as '字段名'FROM #temp_table IF Object_id('Tempdb..#temp_table') IS NOT NULL--删除临时表 DROP TABLE #temp_table go

     查询结果:

         

    --存储过程实现
    --创建存储过程
    CREATE PROC Search (@string NVARCHAR(max))
    AS
      BEGIN
          DECLARE @tbname VARCHAR(50)
          DECLARE tbroy CURSOR FOR
            SELECT name
            FROM   sysobjects
            WHERE  xtype = 'u ' --遍历所有的表
          OPEN tbroy
    
          FETCH next FROM tbroy INTO @tbname
    
          --创建临时表
          IF Object_id('Tempdb..#temp_table') IS NOT NULL
            DROP TABLE #temp_table
    
          CREATE TABLE #temp_table
            (
               ID      INT IDENTITY(1, 1),
               tbname  VARCHAR(max),--表名
               colname VARCHAR(max)--字段名
            )
    
          WHILE @@fetch_status = 0
            BEGIN
                DECLARE @colname VARCHAR(50)
                DECLARE colroy CURSOR FOR
                  SELECT name
                  FROM   syscolumns
                  WHERE  id = Object_id(@tbname)
                         AND xtype IN (SELECT xtype
                                       FROM   systypes
                                       WHERE  name IN ( 'varchar ', 'nvarchar ', 'char ', 'nchar ' ) --数据类型为字符型的字段
                                      ) --第二个游标是第一个游标的嵌套游标,遍历某个表的所有字段
                OPEN colroy
    
                FETCH next FROM colroy INTO @colname
    
                WHILE @@fetch_status = 0
                  BEGIN
                      DECLARE @sql NVARCHAR(1000),
                              @j   INT
    
                      SELECT @sql = 'select @i=count(1) from ' + @tbname
                                    + ' where ' + @colname + ' like ' + '''%' + @string
                                    + '%'''
    
                      EXEC Sp_executesql
                        @sql,
                        N'@i int output',
                        @i=@j output --输出满足条件表的记录数
    
                      IF @j > 0
                        BEGIN
                            INSERT INTO #temp_table
                            SELECT @tbname,
                                   @colname
                        --exec( 'select distinct '+@colname+' from ' +@tbname + ' where '+ @colname+ ' like '+ '''%'+@string+ '%''')
                        END
    
                      FETCH next FROM colroy INTO @colname
                  END
    
                CLOSE colroy
    
                DEALLOCATE colroy
    
                FETCH next FROM tbroy INTO @tbname
            END
    
          CLOSE tbroy
    
          DEALLOCATE tbroy
    
          SELECT id,
                 tbname  AS '表名',
                 colname AS '字段名'
          FROM   #temp_table
    
          IF Object_id('Tempdb..#temp_table') IS NOT NULL--删除临时表
            DROP TABLE #temp_table
      END
    
    go
    
    --使用方法
    EXEC Search 'a'

     查询结果:

        

     
  • 相关阅读:
    已开启博客园~
    友链
    javacv 接收RTSP流(或avi/mp4视频文件),输出byte[]
    Springboot项目中,使用logback来管理日志。
    PPT文件流转为图片,并压缩成ZIP文件输出到指定目录
    通过AOP自定义注解实现记录用户操作日志。
    使用javacv,解码socket接收的H264码流(byte[]),转为yuv处理,最后再合成转为H264
    idea 开始java之旅
    浅谈Winform控件开发(一):使用GDI+美化基础窗口
    WinformGDI+入门级实例——扫雷游戏(附源码)
  • 原文地址:https://www.cnblogs.com/simoncai/p/4383627.html
Copyright © 2011-2022 走看看