急,SQL查询问题!请求帮助!

时间:2021-12-10 15:07:47
正在做课程设计,有个问题不清楚应该怎样做,希望大家能帮忙解答下,谢谢!

关于"模糊查询",希望能把我所建立的每个表,每个字段都搜索查询下,如果有匹配的就能查询到~~
我现在只会对单个表的每个字段进行查询,而不会对多个表的每个字段都查询,希望大家解答下!!

例如:  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 

#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,懂的也不多,通俗点就行

#8


先通过sys.objects系统视图找到当前数据库中的所有用户表.
然后用游标循环逐次去获取这些表名.

再通过sys.columns跟sys.types系统视图找到当前表名的所有char/varchar/nchar/nvarchar类型的列

再通过合并字符串的方法,组合成
xx like N'海' OR xxx LIKE N'海'
的形式

再通过EXEC去动态执行这个SQL语句.

这种全表的模糊搜索.如果在数据量大的情况下,将会很慢.

#9


建议楼主考虑先将表的结构再设计一下
例如将一张表的主键作为另一张表的外键
这样查询起来应该效率会高一点
楼主可以试试

#10


引用 9 楼 zhengkaifl 的回复:
建议楼主考虑先将表的结构再设计一下 
例如将一张表的主键作为另一张表的外键 
这样查询起来应该效率会高一点 
楼主可以试试

各个表的功能是不同的,有的表是有联系的,设的有主键和外键,但有的表没有联系,当然也就没有外键,主键是每个表都有的,不知道有没有简单的方法

#11


引用 8 楼 liangCK 的回复:
先通过sys.objects系统视图找到当前数据库中的所有用户表. 
然后用游标循环逐次去获取这些表名. 

再通过sys.columns跟sys.types系统视图找到当前表名的所有char/varchar/nchar/nvarchar类型的列 

再通过合并字符串的方法,组合成 
xx like N'海' OR xxx LIKE N'海' 
的形式 

再通过EXEC去动态执行这个SQL语句. 

这种全表的模糊搜索.如果在数据量大的情况下,将会很慢.


谢谢小梁,不过是在做毕业设计,由于当时没有学过用"游标"的方法,所以现在用起来不是很方便,
有没有什么笨的方法,速度慢先不考虑,只要能运行出结果就可以,
你说的这种方法我会在之后学习,可现在是有没有更简单易懂的解决方案?

#12


引用 3 楼 happyflystone 的回复:
select * 
from (select * ,tb='customer'from customer 
      union all 
      select *,'employee' from employee) b 
where charindex('海',khmc+khdq) > 0 


这个应该不行吧~~

#13


引用 11 楼 lizzier 的回复:
谢谢小梁,不过是在做毕业设计,由于当时没有学过用"游标"的方法,所以现在用起来不是很方便,
有没有什么笨的方法,速度慢先不考虑,只要能运行出结果就可以,
你说的这种方法我会在之后学习,可现在是有没有更简单易懂的解决方案?


游标不难,就是那么几个操作,
就跟程序语言中的循环差不多.

你可以把偶上面的代码,封装成存储过程,
然后再程序语言里使用ado,ado.net,jdbc什么的调用这个存储过程就好.

#14


引用 13 楼 liangCK 的回复:
引用 11 楼 lizzier 的回复:
谢谢小梁,不过是在做毕业设计,由于当时没有学过用"游标"的方法,所以现在用起来不是很方便, 
有没有什么笨的方法,速度慢先不考虑,只要能运行出结果就可以, 
你说的这种方法我会在之后学习,可现在是有没有更简单易懂的解决方案? 
 

游标不难,就是那么几个操作, 
就跟程序语言中的循环差不多. 

你可以把偶上面的代码,封装成存储过程, 
然后再程序语言里使用ado,ado.net,jdbc什么的调用这个…


只需建立一个新的存储过程就可以了吗?还需建立什么其他的东西吗?
我用的是asp.net,c#

#15


引用 13 楼 liangCK 的回复:
引用 11 楼 lizzier 的回复:
谢谢小梁,不过是在做毕业设计,由于当时没有学过用"游标"的方法,所以现在用起来不是很方便, 
有没有什么笨的方法,速度慢先不考虑,只要能运行出结果就可以, 
你说的这种方法我会在之后学习,可现在是有没有更简单易懂的解决方案? 
 

游标不难,就是那么几个操作, 
就跟程序语言中的循环差不多. 

你可以把偶上面的代码,封装成存储过程, 
然后再程序语言里使用ado,ado.net,jdbc什么的调用这个…



#16


用游标不是一个好办法,如果两个表有联系的话,用一个连接不就完了
看你的叙述我觉得好像没那么复杂

#17


引用 14 楼 lizzier 的回复:
引用 13 楼 liangCK 的回复:
引用 11 楼 lizzier 的回复:
谢谢小梁,不过是在做毕业设计,由于当时没有学过用"游标"的方法,所以现在用起来不是很方便,
有没有什么笨的方法,速度慢先不考虑,只要能运行出结果就可以,
你说的这种方法我会在之后学习,可现在是有没有更简单易懂的解决方案?


游标不难,就是那么几个操作,
就跟程序语言中的循环差不多.

你可以把偶上面的代码,封装成存储过程,
然后再程序语言里使用ado,ado.n…


你是想以什么样的方式显示出来呢?

#18


以列表的形式显示出来就可以,datagrid控件

#19


感觉应该没有那么麻烦呀,大家有没有什么好的方法?
用一个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 

#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,懂的也不多,通俗点就行

#8


先通过sys.objects系统视图找到当前数据库中的所有用户表.
然后用游标循环逐次去获取这些表名.

再通过sys.columns跟sys.types系统视图找到当前表名的所有char/varchar/nchar/nvarchar类型的列

再通过合并字符串的方法,组合成
xx like N'海' OR xxx LIKE N'海'
的形式

再通过EXEC去动态执行这个SQL语句.

这种全表的模糊搜索.如果在数据量大的情况下,将会很慢.

#9


建议楼主考虑先将表的结构再设计一下
例如将一张表的主键作为另一张表的外键
这样查询起来应该效率会高一点
楼主可以试试

#10


引用 9 楼 zhengkaifl 的回复:
建议楼主考虑先将表的结构再设计一下 
例如将一张表的主键作为另一张表的外键 
这样查询起来应该效率会高一点 
楼主可以试试

各个表的功能是不同的,有的表是有联系的,设的有主键和外键,但有的表没有联系,当然也就没有外键,主键是每个表都有的,不知道有没有简单的方法

#11


引用 8 楼 liangCK 的回复:
先通过sys.objects系统视图找到当前数据库中的所有用户表. 
然后用游标循环逐次去获取这些表名. 

再通过sys.columns跟sys.types系统视图找到当前表名的所有char/varchar/nchar/nvarchar类型的列 

再通过合并字符串的方法,组合成 
xx like N'海' OR xxx LIKE N'海' 
的形式 

再通过EXEC去动态执行这个SQL语句. 

这种全表的模糊搜索.如果在数据量大的情况下,将会很慢.


谢谢小梁,不过是在做毕业设计,由于当时没有学过用"游标"的方法,所以现在用起来不是很方便,
有没有什么笨的方法,速度慢先不考虑,只要能运行出结果就可以,
你说的这种方法我会在之后学习,可现在是有没有更简单易懂的解决方案?

#12


引用 3 楼 happyflystone 的回复:
select * 
from (select * ,tb='customer'from customer 
      union all 
      select *,'employee' from employee) b 
where charindex('海',khmc+khdq) > 0 


这个应该不行吧~~

#13


引用 11 楼 lizzier 的回复:
谢谢小梁,不过是在做毕业设计,由于当时没有学过用"游标"的方法,所以现在用起来不是很方便,
有没有什么笨的方法,速度慢先不考虑,只要能运行出结果就可以,
你说的这种方法我会在之后学习,可现在是有没有更简单易懂的解决方案?


游标不难,就是那么几个操作,
就跟程序语言中的循环差不多.

你可以把偶上面的代码,封装成存储过程,
然后再程序语言里使用ado,ado.net,jdbc什么的调用这个存储过程就好.

#14


引用 13 楼 liangCK 的回复:
引用 11 楼 lizzier 的回复:
谢谢小梁,不过是在做毕业设计,由于当时没有学过用"游标"的方法,所以现在用起来不是很方便, 
有没有什么笨的方法,速度慢先不考虑,只要能运行出结果就可以, 
你说的这种方法我会在之后学习,可现在是有没有更简单易懂的解决方案? 
 

游标不难,就是那么几个操作, 
就跟程序语言中的循环差不多. 

你可以把偶上面的代码,封装成存储过程, 
然后再程序语言里使用ado,ado.net,jdbc什么的调用这个…


只需建立一个新的存储过程就可以了吗?还需建立什么其他的东西吗?
我用的是asp.net,c#

#15


引用 13 楼 liangCK 的回复:
引用 11 楼 lizzier 的回复:
谢谢小梁,不过是在做毕业设计,由于当时没有学过用"游标"的方法,所以现在用起来不是很方便, 
有没有什么笨的方法,速度慢先不考虑,只要能运行出结果就可以, 
你说的这种方法我会在之后学习,可现在是有没有更简单易懂的解决方案? 
 

游标不难,就是那么几个操作, 
就跟程序语言中的循环差不多. 

你可以把偶上面的代码,封装成存储过程, 
然后再程序语言里使用ado,ado.net,jdbc什么的调用这个…



#16


用游标不是一个好办法,如果两个表有联系的话,用一个连接不就完了
看你的叙述我觉得好像没那么复杂

#17


引用 14 楼 lizzier 的回复:
引用 13 楼 liangCK 的回复:
引用 11 楼 lizzier 的回复:
谢谢小梁,不过是在做毕业设计,由于当时没有学过用"游标"的方法,所以现在用起来不是很方便,
有没有什么笨的方法,速度慢先不考虑,只要能运行出结果就可以,
你说的这种方法我会在之后学习,可现在是有没有更简单易懂的解决方案?


游标不难,就是那么几个操作,
就跟程序语言中的循环差不多.

你可以把偶上面的代码,封装成存储过程,
然后再程序语言里使用ado,ado.n…


你是想以什么样的方式显示出来呢?

#18


以列表的形式显示出来就可以,datagrid控件

#19


感觉应该没有那么麻烦呀,大家有没有什么好的方法?
用一个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


学习