加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

从数据库所有表中查找特定的数据

(2020-05-15 08:31:37)
标签:

从数据库的所有表中查

所有表中查找数据

杂谈

分类: 代码天地

一 应用来源

  引进的程序没有源代码,或者了解其他人的程序,都需要了解程序逻辑结构,刚开始一无所知,可以先输入一些有特点的数据,让后从库中查找这些数据存储到哪些表中,通过该表外键,再知道与之相关的表,逐一下去就能了解整个程序的走向。
  这样就需要从数据库中,查找特定的数据来自哪些表的功能。

二 存储过程

  使用存储过程可以完成相对复杂的功能,因此该功能使用了存储过程。

-- =============================================
-- Description: 从数据库中查找特定数据所在的所有表
-- =============================================
ALTER PROCEDURE [dbo].[P_find]
(  
    @DataType INT,--类型:1字符型、2数值型 、3日期型  
    @searchData  NVarChar(200)--需要搜索的内容   
 
AS 
    --创建临时表存放结果
    IF exists (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[#resTable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    DROP TABLE [dbo].[#resTable]
       
    CREATE TABLE #resTable(ID int identity primary key,tblName sysname,colName sysname)  
    
    IF (@DataType <> 1 AND @DataType <> 2 AND @DataType <> 3) GOTO Quit
     
    DECLARE @tblName NVarChar(500),@colName sysname,@sql nvarchar(1000), @type_id NVarChar(100)  
    
    IF @DataType = 1   
              set @type_id='167,175,231,239,35,99'
    ELSE IF @DataType = 2 
          set @type_id='56,48,52,59,60,62,106,108,122'
    ELSE IF @DataType = 3   
           set @type_id='61'
           
    DECLARE tmpCursor cursor fast_forward  
     For   
        Select '['+SCHEMA_NAME(SCHEMA_ID)+'].['+o.name+']' tableName,'['+c.name+']' columnName 
          From sys.columns c inner join sys.objects o on c.object_id=o.object_id  
          Where o.type_desc='user_table' and CHARINDEX(','+CAST(user_type_id AS nvarchar)+',',','+@type_id+',')>0   
          --Where o.type_desc='user_table' and user_type_id  IN (167,175,231,239,35,99)

    OPEN tmpCursor  
    FETCH next from tmpCursor into @tblName,@colName  
    WHILE @@FETCH_STATUS=0  
    BEGIN  
        SET @sql='if exists (select * from '+@tblName+' where '  
        IF @DataType =1
              set @sql =@sql + @colName + ' like ''%'+@searchData +'%'')'  
        ELSE IF @DataType =2 
            set @sql =@sql + @colName + ' in ('+@searchData+'))'  
        ELSE IF @DataType =3
            set @sql =@sql + 'CONVERT(Varchar(20),'+@colName + ',121) like ''%'+@searchData +'%'')' 
        
        SET @sql = @sql +' INSERT #resTable(tblName,colName) VALUES('''+@tblName+''','''+@colName+''')'  
       ---print @sql   
        EXEC (@sql)  
    FETCH next from tmpCursor into @tblName,@colName  
    END  
    CLOSE tmpCursor   
    DEALLOCATE tmpCursor
   QUIT: 
    IF (SELECT COUNT(*) FROM #resTable) > 0 
    BEGIN
        DECLARE @ls_Table NVarChar(500),@ls_col sysname,@ls_sql nvarchar(1000) 
        DECLARE Cur_DataTable CURSOR FOR SELECT tblName,colName FROM #resTable
        OPEN Cur_DataTable
        FETCH NEXT FROM  Cur_DataTable INTO @ls_Table,@ls_col
        WHILE @@FETCH_STATUS = 0
        BEGIN
            IF @DataType <> 3
            SET @ls_sql = 'select '''+@ls_Table+''+''+@ls_col+'''as 表名字段名,'+@ls_col+' from '+@ls_Table+' where '+@ls_col+' like ''%'+@searchData+'%'''
            ELSE
            SET @ls_sql = 'select '''+@ls_Table+''+''+@ls_col+'''as 表名字段名,'+@ls_col+' from '+@ls_Table+' where convert(VarChar(20),'+@ls_col+',121) like ''%'+@searchData+'%'''
            --print (@ls_sql)
            EXEC (@ls_sql)
        FETCH next from Cur_DataTable into @ls_Table,@ls_col
        END
        CLOSE Cur_DataTable   
        DEALLOCATE Cur_DataTable
    END

三  使用方法

USE [BOOK] --数据库

EXEC P_find  1,'曹雪芹'

四 得到结果


1 查到了  [图书档案]表的字段 [作者]
表字段                 作者
[dbo].[图书档案][作者]      曹雪芹


2  查到了 [订阅书籍]表的字段 [作者]
表字段                作者
[dbo].[订阅书籍][作者]      曹雪芹


从数据库所有表中查找特定的数据


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有