一 应用来源
引进的程序没有源代码,或者了解其他人的程序,都需要了解程序逻辑结构,刚开始一无所知,可以先输入一些有特点的数据,让后从库中查找这些数据存储到哪些表中,通过该表外键,再知道与之相关的表,逐一下去就能了解整个程序的走向。
这样就需要从数据库中,查找特定的数据来自哪些表的功能。
二 存储过程
使用存储过程可以完成相对复杂的功能,因此该功能使用了存储过程。
-- =============================================
-- 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
三 使用方法
EXEC P_find 1,'曹雪芹'
四 得到结果
1 查到了 [图书档案]表的字段 [作者]
表字段
作者
[dbo].[图书档案][作者]
曹雪芹
2 查到了 [订阅书籍]表的字段 [作者]
表字段
作者
[dbo].[订阅书籍][作者]
曹雪芹
加载中,请稍候......