简单查询问题,期待高手再次出现 期待大力、邹建。。。 在线等待
我有一个存储过程,在其参数中参传查询条件,如下简单查询所示
use northwind
declare @str nvarchar(100)--为参数中传过来的值
set @str='be,con'--根据具体情况,可能包含更多的值,如'be,con,dai'等等,只有用户使用时才确定
select * from categories where categoryname like ('%'+@str +'%')
--但因为like中的值有多个且用','分隔开了,所以查询时根本查不到所想要的记录
--现急向多位大哥大姐求救,怎么样才能查到我想要的结果?
--谢谢!!!!!!!!!!!!!!!!!!!!!!!!!!在线等
--如上条件为set @str='be,con'时,应查出的值有Beverages / Condiments / Confections 即类似于
--select * from categories where categoryname like '%be%' or categoryname like '%con%'
问题点数:100、回复次数:8Top
1 楼LouisXIV(夜游神)回复于 2006-07-01 12:25:50 得分 0
--try
use northwind
declare @str nvarchar(100)--为参数中传过来的值
set @str='be,con'--根据具体情况,可能包含更多的值,如'be,con,dai'等等,只有用户使用时才确定
select * from categories where charindex(','+categoryname+',',','+@str +',')>0Top
2 楼LouisXIV(夜游神)回复于 2006-07-01 12:26:40 得分 0
没看清楚-_-
上面的放弃Top
3 楼LouisXIV(夜游神)回复于 2006-07-01 12:40:02 得分 50
--try
use northwind
declare @str nvarchar(100)
set @str='be,con'
declare @sql varchar(8000)
set @sql=('select * from categories where categoryname like '+'''%'+replace(@str,',','%'' or categoryname like ''%') +'%''')
exec (@sql)
Top
4 楼Anhowe(寒冰)回复于 2006-07-01 12:40:17 得分 0
LouisXIV(夜游神) 大哥,还有什么好办法吗?因为我那个条件是不不确定值,内容不是某个列中的完整值,而是列中的部份值
不过很谢谢您这么快对我问题的关注Top
5 楼zjcxc(邹建)回复于 2006-07-01 12:43:11 得分 0
use northwind
declare @str nvarchar(100)--为参数中传过来的值
set @str='be,con'--根据具体情况,可能包含更多的值,如'be,con,dai'等等,只有用户使用时才确定
declare @where varchar(8000)
set @where = 'categoryname like ''%' + replace(@str, ',', '%'' and categoryname like ''%') + '%'''
exec('
select * from categories where '+@where)Top
6 楼zjcxc(邹建)回复于 2006-07-01 12:44:01 得分 40
use northwind
declare @str nvarchar(100)--为参数中传过来的值
set @str='be,con'--根据具体情况,可能包含更多的值,如'be,con,dai'等等,只有用户使用时才确定
declare @where varchar(8000)
set @where = 'categoryname like ''%' + replace(@str, ',', '%'' or categoryname like ''%') + '%'''
exec('
select * from categories where '+@where)
Top
7 楼playwarcraft(时间就像乳沟,挤挤还是有的)回复于 2006-07-01 12:50:44 得分 5
--先定义个function
Create FUNCTION SplitList
(@separator char(1), @List varchar(8000))
RETURNS @ReturnTable TABLE(ListItem varchar(1000) COLLATE Database_Default)
AS
BEGIN
DECLARE @Index int
DECLARE @NewText varchar(8000)
IF @List = null
RETURN
SET @Index = CHARINDEX(@separator, @List)
WHILE NOT(@Index = 0)
BEGIN
SET @NewText = RTRIM(LTRIM(LEFT(@List, @Index - 1)))
SET @List = RIGHT(@List, LEN(@List) - @Index)
INSERT INTO @ReturnTable(ListItem) VALUES(@NewText)
SET @Index = CHARINDEX(@separator, @List)
END
INSERT INTO @ReturnTable(ListItem) VALUES(RTRIM(LTRIM(@List)))
RETURN
END
--在定义存储程序
create table #temp (...) -- 与表categories结构一致
declare @str nvarchar(100),@Item nvarchar(100)
set @str='be,con'
declare c1 cursor scroll for
select listItem from SplitList(',',@str) T
open c1
fetch first from c1 into @Item
while @@fetch_status=0
begin
insert into #temp
select * from categories where categoryname like ('%'+@str +'%')
fetch next from c1 into @Item
end
select * from #temp
close c1
deallocate c1
Top
8 楼fcuandy(了此残生.)回复于 2006-07-01 13:02:14 得分 5
SELECT categories.* FROM categories
INNER JOIN dbo.Split(@str,',')
ON CAHRINDEX(tempColumn,categoryname)>0
split函數
CREATE Function Split(@Sql varchar(8000),@Splits varchar(100))
returns @temp Table (tempColumn varchar(100))
As
Begin
Declare @i Int
Set @Sql = RTrim(LTrim(@Sql))
Set @i = CharIndex(@Splits,@Sql)
While @i >= 1
Begin
Insert @temp Values(Left(@Sql,@i-1))
Set @Sql = SubString(@Sql,@i+len(@Splits),Len(@Sql)-@i)
Set @i = CharIndex(@Splits,@Sql)
End
If @Sql <> ''
Insert @temp Values (@Sql)
Return
EndTop




