关于"模糊查询",希望能把我所建立的每个表,每个字段都搜索查询下,如果有匹配的就能查询到~~
我现在只会对单个表的每个字段进行查询,而不会对多个表的每个字段都查询,希望大家解答下!!
例如: customer(khmc,khdq)
employee(ygxm,ygdz)
这两个表,怎么对khmc,khdq,ygxm,ygdz这四个字段都进行查询?
如果查询某个字,如"海",就会在这两个表的四个字段中进行检索,查到这两个表中所有含有"海"这个字的信息,同时在一张表上显示!
不知大家看懂没,希望理解意思的能够解答下,谢谢了!
26 个解决方案
#1
这样搜索,估计很慢.
#2
关注
#3
select *
from (select * ,tb='customer'from customer
union all
select *,'employee' from employee) b
where charindex('海',khmc+khdq) > 0
from (select * ,tb='customer'from customer
union all
select *,'employee' from employee) b
where charindex('海',khmc+khdq) > 0
#4
估计应该用到全文索引吧。
#5
--customer(khmc,khdq)
--employee(ygxm,ygdz)
DECLARE cur_tb CURSOR FOR
SELECT schema_id,name FROM sys.objects
WHERE type=N'U' AND is_ms_shipped=0;
DECLARE @tbname SYSNAME,@schema_id SYSNAME;
DECLARE @columns NVARCHAR(4000);
DECLARE @i INT;
DECLARE @find_string NVARCHAR(100);
DECLARE @cmd NVARCHAR(4000);
SET @find_string=N'海';
OPEN cur_tb;
FETCH NEXT FROM cur_tb INTO @schema_id,@tbname;
WHILE @@FETCH_STATUS=0
BEGIN
SET @columns='';
SET @i=0;
SELECT
@columns=@columns+
CASE WHEN @i=0 THEN '' ELSE ' OR 'END
+'['+c.name+']'+' LIKE N''%'+@find_string+'%''',
@i=@i+1
FROM sys.columns AS c
JOIN sys.types AS t
ON c.user_type_id=t.user_type_id
WHERE c.[object_id]=OBJECT_ID(SCHEMA_NAME(@schema_id)+'.'+@tbname,N'U')
AND t.name IN('char','varchar','nchar','nvarchar');
SET @cmd='SELECT * FROM ['+SCHEMA_NAME(@schema_id)+'].['+@tbname+'] WHERE '+@columns;
PRINT @cmd;
IF @i>0
EXEC(@cmd)
FETCH NEXT FROM cur_tb INTO @schema_id,@tbname;
END
CLOSE cur_tb;
DEALLOCATE cur_tb;
#6
帮顶。
#7
楼上的小梁:
这个答案看不太懂,能否给解释下,我也是刚学的SQL,懂的也不多,通俗点就行
这个答案看不太懂,能否给解释下,我也是刚学的SQL,懂的也不多,通俗点就行
#8
先通过sys.objects系统视图找到当前数据库中的所有用户表.
然后用游标循环逐次去获取这些表名.
再通过sys.columns跟sys.types系统视图找到当前表名的所有char/varchar/nchar/nvarchar类型的列
再通过合并字符串的方法,组合成
xx like N'海' OR xxx LIKE N'海'
的形式
再通过EXEC去动态执行这个SQL语句.
这种全表的模糊搜索.如果在数据量大的情况下,将会很慢.
然后用游标循环逐次去获取这些表名.
再通过sys.columns跟sys.types系统视图找到当前表名的所有char/varchar/nchar/nvarchar类型的列
再通过合并字符串的方法,组合成
xx like N'海' OR xxx LIKE N'海'
的形式
再通过EXEC去动态执行这个SQL语句.
这种全表的模糊搜索.如果在数据量大的情况下,将会很慢.
#9
建议楼主考虑先将表的结构再设计一下
例如将一张表的主键作为另一张表的外键
这样查询起来应该效率会高一点
楼主可以试试
例如将一张表的主键作为另一张表的外键
这样查询起来应该效率会高一点
楼主可以试试
#10
各个表的功能是不同的,有的表是有联系的,设的有主键和外键,但有的表没有联系,当然也就没有外键,主键是每个表都有的,不知道有没有简单的方法
#11
谢谢小梁,不过是在做毕业设计,由于当时没有学过用"游标"的方法,所以现在用起来不是很方便,
有没有什么笨的方法,速度慢先不考虑,只要能运行出结果就可以,
你说的这种方法我会在之后学习,可现在是有没有更简单易懂的解决方案?
#12
这个应该不行吧~~
#13
游标不难,就是那么几个操作,
就跟程序语言中的循环差不多.
你可以把偶上面的代码,封装成存储过程,
然后再程序语言里使用ado,ado.net,jdbc什么的调用这个存储过程就好.
#14
只需建立一个新的存储过程就可以了吗?还需建立什么其他的东西吗?
我用的是asp.net,c#
#15
唉
#16
用游标不是一个好办法,如果两个表有联系的话,用一个连接不就完了
看你的叙述我觉得好像没那么复杂
看你的叙述我觉得好像没那么复杂
#17
你是想以什么样的方式显示出来呢?
#18
以列表的形式显示出来就可以,datagrid控件
#19
感觉应该没有那么麻烦呀,大家有没有什么好的方法?
用一个sql语句就可以完成的?
用一个sql语句就可以完成的?
#20
DECLARE @fieldtype sysname
SET @fieldtype='varchar'
--查询
DECLARE hCForEach CURSOR GLOBAL
FOR
SELECT N'select ' + QUOTENAME(c.name)+' from '+QUOTENAME(o.name)
+N' where charindex(''海'','+ QUOTENAME(c.name)+') > 0 '
FROM sysobjects o,syscolumns c,systypes t
WHERE o.id=c.id
AND OBJECTPROPERTY(o.id,N'IsUserTable')=1
AND c.xusertype=t.xusertype
AND t.name=@fieldtype
EXEC sp_MSforeach_Worker @command1=N'?'
#21
.
#22
正在制作
#23
看上去挺麻烦的啊
#24
很麻烦吗?呵呵
现在不知道该以什么样的形式来显示了
困惑~~
现在不知道该以什么样的形式来显示了
困惑~~
#25
20楼能否解释下,看不太明白。
#26
学习
#1
这样搜索,估计很慢.
#2
关注
#3
select *
from (select * ,tb='customer'from customer
union all
select *,'employee' from employee) b
where charindex('海',khmc+khdq) > 0
from (select * ,tb='customer'from customer
union all
select *,'employee' from employee) b
where charindex('海',khmc+khdq) > 0
#4
估计应该用到全文索引吧。
#5
--customer(khmc,khdq)
--employee(ygxm,ygdz)
DECLARE cur_tb CURSOR FOR
SELECT schema_id,name FROM sys.objects
WHERE type=N'U' AND is_ms_shipped=0;
DECLARE @tbname SYSNAME,@schema_id SYSNAME;
DECLARE @columns NVARCHAR(4000);
DECLARE @i INT;
DECLARE @find_string NVARCHAR(100);
DECLARE @cmd NVARCHAR(4000);
SET @find_string=N'海';
OPEN cur_tb;
FETCH NEXT FROM cur_tb INTO @schema_id,@tbname;
WHILE @@FETCH_STATUS=0
BEGIN
SET @columns='';
SET @i=0;
SELECT
@columns=@columns+
CASE WHEN @i=0 THEN '' ELSE ' OR 'END
+'['+c.name+']'+' LIKE N''%'+@find_string+'%''',
@i=@i+1
FROM sys.columns AS c
JOIN sys.types AS t
ON c.user_type_id=t.user_type_id
WHERE c.[object_id]=OBJECT_ID(SCHEMA_NAME(@schema_id)+'.'+@tbname,N'U')
AND t.name IN('char','varchar','nchar','nvarchar');
SET @cmd='SELECT * FROM ['+SCHEMA_NAME(@schema_id)+'].['+@tbname+'] WHERE '+@columns;
PRINT @cmd;
IF @i>0
EXEC(@cmd)
FETCH NEXT FROM cur_tb INTO @schema_id,@tbname;
END
CLOSE cur_tb;
DEALLOCATE cur_tb;
#6
帮顶。
#7
楼上的小梁:
这个答案看不太懂,能否给解释下,我也是刚学的SQL,懂的也不多,通俗点就行
这个答案看不太懂,能否给解释下,我也是刚学的SQL,懂的也不多,通俗点就行
#8
先通过sys.objects系统视图找到当前数据库中的所有用户表.
然后用游标循环逐次去获取这些表名.
再通过sys.columns跟sys.types系统视图找到当前表名的所有char/varchar/nchar/nvarchar类型的列
再通过合并字符串的方法,组合成
xx like N'海' OR xxx LIKE N'海'
的形式
再通过EXEC去动态执行这个SQL语句.
这种全表的模糊搜索.如果在数据量大的情况下,将会很慢.
然后用游标循环逐次去获取这些表名.
再通过sys.columns跟sys.types系统视图找到当前表名的所有char/varchar/nchar/nvarchar类型的列
再通过合并字符串的方法,组合成
xx like N'海' OR xxx LIKE N'海'
的形式
再通过EXEC去动态执行这个SQL语句.
这种全表的模糊搜索.如果在数据量大的情况下,将会很慢.
#9
建议楼主考虑先将表的结构再设计一下
例如将一张表的主键作为另一张表的外键
这样查询起来应该效率会高一点
楼主可以试试
例如将一张表的主键作为另一张表的外键
这样查询起来应该效率会高一点
楼主可以试试
#10
各个表的功能是不同的,有的表是有联系的,设的有主键和外键,但有的表没有联系,当然也就没有外键,主键是每个表都有的,不知道有没有简单的方法
#11
谢谢小梁,不过是在做毕业设计,由于当时没有学过用"游标"的方法,所以现在用起来不是很方便,
有没有什么笨的方法,速度慢先不考虑,只要能运行出结果就可以,
你说的这种方法我会在之后学习,可现在是有没有更简单易懂的解决方案?
#12
这个应该不行吧~~
#13
游标不难,就是那么几个操作,
就跟程序语言中的循环差不多.
你可以把偶上面的代码,封装成存储过程,
然后再程序语言里使用ado,ado.net,jdbc什么的调用这个存储过程就好.
#14
只需建立一个新的存储过程就可以了吗?还需建立什么其他的东西吗?
我用的是asp.net,c#
#15
唉
#16
用游标不是一个好办法,如果两个表有联系的话,用一个连接不就完了
看你的叙述我觉得好像没那么复杂
看你的叙述我觉得好像没那么复杂
#17
你是想以什么样的方式显示出来呢?
#18
以列表的形式显示出来就可以,datagrid控件
#19
感觉应该没有那么麻烦呀,大家有没有什么好的方法?
用一个sql语句就可以完成的?
用一个sql语句就可以完成的?
#20
DECLARE @fieldtype sysname
SET @fieldtype='varchar'
--查询
DECLARE hCForEach CURSOR GLOBAL
FOR
SELECT N'select ' + QUOTENAME(c.name)+' from '+QUOTENAME(o.name)
+N' where charindex(''海'','+ QUOTENAME(c.name)+') > 0 '
FROM sysobjects o,syscolumns c,systypes t
WHERE o.id=c.id
AND OBJECTPROPERTY(o.id,N'IsUserTable')=1
AND c.xusertype=t.xusertype
AND t.name=@fieldtype
EXEC sp_MSforeach_Worker @command1=N'?'
#21
.
#22
正在制作
#23
看上去挺麻烦的啊
#24
很麻烦吗?呵呵
现在不知道该以什么样的形式来显示了
困惑~~
现在不知道该以什么样的形式来显示了
困惑~~
#25
20楼能否解释下,看不太明白。
#26
学习