平时在在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)!