sql中生成查询的模糊匹配字符串

时间:2021-07-23 00:41:11
  1. if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_Sql]') and xtype in (N'FN', N'IF', N'TF'))  
  2. drop function [dbo].[f_Sql]  
  3. GO  
  4.  
  5. if exists (select * from dbo.sysobjects where id = object_id(N'[序数表]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)  
  6. drop table [序数表]  
  7. GO  
  8.  
  9. --为了效率,所以要一个辅助表配合  
  10. select top 1000 id=identity(int,1,1) into 序数表   
  11. from syscolumns a,syscolumns b  
  12. alter table 序数表 add constraint pk_id_序数表 primary key(id)  
  13. go  
  14.  
  15. /*--根据指定字符串生成查询的模糊匹配字符串  
  16.  
  17.  条件连接的关键字为 and,or  
  18.  可以任意指定括号  
  19.  生成的条件表达式为 like 模糊匹配  
  20.  
  21. --邹建 2004.08(引用请保留此信息)--*/  
  22.  
  23. /*--调用示例  
  24.  
  25.  --调用示例  
  26.  select A=dbo.f_Sql('(Web or HTML or Internet) and (Programmer or Developer)','content')  
  27.  select B=dbo.f_Sql('Web or HTML or Internet','content')  
  28.  select C=dbo.f_Sql('(Web and HTML)','content')  
  29.  select D=dbo.f_Sql('Web','content')  
  30. --*/  
  31. --示例函数  
  32. create function f_Sql(  
  33. @str Nvarchar(1000), --要检索的字符串  
  34. @fdname sysname --在那个字段中检索  
  35. )returns Nvarchar(4000)  
  36. as  
  37. begin  
  38.  declare @r Nvarchar(4000)  
  39.  set @r=''  
  40.  select @r=@r+case  
  41.   when substring(@str,id,charindex(' ',@str+' ',id)-id) in('or','and')  
  42.    then ' '+substring(@str,id,charindex(' ',@str+' ',id)-id)+' '  
  43.   when substring(@str,id,1)='('  
  44.    then '(['+@fdname+'] like ''%'  
  45.     +substring(@str,id+1,charindex(' ',@str+' ',id)-id-1)  
  46.     +'%'''  
  47.   when substring(@str,charindex(' ',@str+' ',id)-1,1)=')'  
  48.    then '['+@fdname+'] like ''%'  
  49.     +substring(@str,id,charindex(' ',@str+' ',id)-id-1)  
  50.     +'%'')'  
  51.   else '['+@fdname+'] like ''%'  
  52.    +substring(@str,id,charindex(' ',@str+' ',id)-id)  
  53.    +'%'''  
  54.   end  
  55.  from 序数表  
  56.  where id<=len(@str)  
  57.   and charindex(' ',' '+@str,id)-id=0  
  58.  return(@r)  
  59. end  
  60. go