sqlserver存储过程的like模糊查询问题
时间:2011-11-28
来源:互联网
按多条件模糊查询,比如快捷搜索,可同时输入一个或多个关键字进行查询。
传入的参数是一个字符串,右一个或多个关键字和空格组成,
存储过程中需要完成:
按空格拆分字符串,并查询符合条件的记录
代码如下:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Spid]
@intParentID INT,
@intRoleID INT,
@QuickselectStr nvarchar(100)//关键字和空格组成的字符串,长度不定
AS
BEGIN
SET NOCOUNT ON
-- 如果角色ID为-1,表示用户身份为Guest,可以浏览除了系统管理菜单之外的全部菜单
IF(@intRoleID=-1)
BEGIN
SELECT * FROM MenuInfo
WHERE ParentID=@intParentID AND ParentID!=-1 AND MenuDes like '%'关键字'%' ORDER BY menuorder
END
SET NOCOUNT OFF
END
该怎么写?没分了,都给你,在线等
传入的参数是一个字符串,右一个或多个关键字和空格组成,
存储过程中需要完成:
按空格拆分字符串,并查询符合条件的记录
代码如下:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Spid]
@intParentID INT,
@intRoleID INT,
@QuickselectStr nvarchar(100)//关键字和空格组成的字符串,长度不定
AS
BEGIN
SET NOCOUNT ON
-- 如果角色ID为-1,表示用户身份为Guest,可以浏览除了系统管理菜单之外的全部菜单
IF(@intRoleID=-1)
BEGIN
SELECT * FROM MenuInfo
WHERE ParentID=@intParentID AND ParentID!=-1 AND MenuDes like '%'关键字'%' ORDER BY menuorder
END
SET NOCOUNT OFF
END
该怎么写?没分了,都给你,在线等
作者: hdandll 发布时间: 2011-11-28
将你传入的参数拆分到一个临时表里面 在做查询。
作者: Beirut 发布时间: 2011-11-28
SQL code
--> 测试数据: #T if object_id('tempdb.dbo.#T') is not null drop table #T create table #T (id int,name varchar(8)) insert into #T select 1,'jame,job' union all select 2,'paul,mc' union all select 3,'carl'; --> 1. CTE 递归找分隔字符位置法:速度极快 with T (id,P1,P2) as ( select id,charindex(',',','+name),charindex(',',name+',')+1 from #T union all select a.id,b.P2,charindex(',',name+',',b.P2)+1 from #T a join T b on a.id=b.id where charindex(',',name+',',b.P2)>0 ) select a.id,name=substring(a.name+',',b.P1,b.P2 - b.P1 - 1) from #T a join T b on a.id=b.id order by 1 /* id name ----------- --------- 1 jame 1 job 2 mc 2 paul 3 carl */ --> 测试数据: #T if object_id('tempdb.dbo.#T') is not null drop table #T create table #T (id int,name varchar(8)) insert into #T select 1,'jame,job' union all select 2,'paul,mc' union all select 3,'carl'; --> 2. 临时表法:速度比CTE方法相差无几 if object_id('tempdb.dbo.#') is not null drop table # select top 8000 id=identity(int,1,1) into # from syscolumns,sysobjects --> select max(len(name)) from #T=11 select a.id,name=substring(a.name+',',b.id,charindex(',',a.name+',',b.id+1)-b.id) from #T a inner join # b on substring(','+a.name,b.id,1)=',' /* id name ----------- --------- 1 jame 1 job 2 mc 2 paul 3 carl */ 3. XML法:速度较慢 select a.id,b.name from (select id,name=convert(xml,'<root><v>'+replace(name,',','</v><v>')+'</v></root>') from #T ) a outer apply (select name=N.v.value('.','varchar(100)') from a.name.nodes('/root/v') N(v)) b /* id name ----------- --------- 1 jame 1 job 2 mc 2 paul 3 carl */
作者: Beirut 发布时间: 2011-11-28
我看看啊,
作者: hdandll 发布时间: 2011-11-28
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Sp_Frame_Menu_QuickSelectGetMenuByRoleID]
-- Add the parameters for the stored procedure here
@intParentID INT,
@intRoleID INT,
@QuickselectStr nvarchar(100)//传入的关键字和空格组成的字符串
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON
-- Insert statements for procedure here
-- 如果角色ID为-1,表示用户身份为Guest,
IF(@intRoleID=-1)
BEGIN
SELECT * FROM Tb_Frame_MenuInfo
WHERE ParentID=@intParentID AND ParentID!=-1 AND MenuDes like '%'+@QuickselectStr+'%' ORDER BY menuorder
END
-- 如果角色ID为-2,表示用户身份为Manager
ELSE IF(@intRoleID=-2)
BEGIN
SELECT * FROM Tb_Frame_MenuInfo
WHERE ParentID=@intParentID AND MenuDes like'%'+@QuickselectStr+'%' ORDER BY menuorder
END
ELSE
BEGIN
SELECT * FROM Tb_Frame_MenuInfo
WHERE Parentid=@intParentID AND MenuDes like'%'+@QuickselectStr+'%' AND MenuID IN
(SELECT MenuID FROM Tb_Frame_PermissionInfo WHERE PermissionID IN
(SELECT PermissionID FROM Tb_Frame_RolePermissionInfo WHERE RoleID=@intRoleID))
ORDER BY menuorder
END
SET NOCOUNT OFF
END
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Sp_Frame_Menu_QuickSelectGetMenuByRoleID]
-- Add the parameters for the stored procedure here
@intParentID INT,
@intRoleID INT,
@QuickselectStr nvarchar(100)//传入的关键字和空格组成的字符串
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON
-- Insert statements for procedure here
-- 如果角色ID为-1,表示用户身份为Guest,
IF(@intRoleID=-1)
BEGIN
SELECT * FROM Tb_Frame_MenuInfo
WHERE ParentID=@intParentID AND ParentID!=-1 AND MenuDes like '%'+@QuickselectStr+'%' ORDER BY menuorder
END
-- 如果角色ID为-2,表示用户身份为Manager
ELSE IF(@intRoleID=-2)
BEGIN
SELECT * FROM Tb_Frame_MenuInfo
WHERE ParentID=@intParentID AND MenuDes like'%'+@QuickselectStr+'%' ORDER BY menuorder
END
ELSE
BEGIN
SELECT * FROM Tb_Frame_MenuInfo
WHERE Parentid=@intParentID AND MenuDes like'%'+@QuickselectStr+'%' AND MenuID IN
(SELECT MenuID FROM Tb_Frame_PermissionInfo WHERE PermissionID IN
(SELECT PermissionID FROM Tb_Frame_RolePermissionInfo WHERE RoleID=@intRoleID))
ORDER BY menuorder
END
SET NOCOUNT OFF
END
作者: hdandll 发布时间: 2011-11-28
上面代码是我的只输入一个查询条件时的存储过程,能帮我改下吗高手,我会好好学习的。
作者: hdandll 发布时间: 2011-11-28
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28