首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

关于在SQL SERVER的用户函数中做IN操作,该如何解决

2012-03-23 
关于在SQL SERVER的用户函数中做IN操作需求如下:有一个函数中的有一个查询条件是需要做in操作的,条件通过

关于在SQL SERVER的用户函数中做IN操作
需求如下:有一个函数中的有一个查询条件是需要做in操作的,条件通过参数传进来,例如传进的条件为: 'aa,bb,cc,dd,ee,ff '
    需要通过in操作来进行查询,偶试了N种方法,都没成功.最后只好先把传进来的条件拆分,然后再循环查询处理.(特别说明:不希望建临时表处理),现在的处理方式如下:

CREATE   function   GetSimpleDic(@Value   varchar(1000))
returns   varchar(8000)
as
begin
                          declare   @tmpStr   varchar(300)
declare   @Value1   varchar(1200)
declare   @RetVal   varchar(8000)
set   @RetVal= ' '
Set   @Value1=@Value
declare   @myPos   int
set   @myPos=charindex( ', ',@Value1)
while   @myPos> 0
begin
set   @tmpStr= ' '

select   @tmpStr=DictCode   from   SecSimpleDict  
Where     DictValue   =   substring(@Value1,0,@myPos)
                                                      set   @RetVal=@RetVal+isnull(@tmpStr, ' ')+ '; '
                                                      set   @Value1=substring(@Value1,@myPos+1,len(@Value1)-@myPos)
set   @myPos=charindex( ', ',@Value1)
end
set   @tmpStr= ' '
                          select   @tmpStr=DictCode   from   SecSimpleDict  
where   DictValue=@Value1
                          set   @RetVal=@RetVal+isnull(@tmpStr, ' ')
                      return   @RetVal
end


100分求哪位高手做成直接使用in查询的函数........

[解决办法]

CREATE function GetSimpleDic(@Value varchar(1000))
returns varchar(8000)
as
begin
declare @tmpStr varchar(300)
declare @Value1 varchar(1200)
declare @RetVal varchar(8000)
set @RetVal= ' '
Set @Value1=@Value
declare @myPos int
set @myPos=charindex( ', ',@Value1)
while @myPos> 0
begin
set @tmpStr= ' '

select @tmpStr=DictCode from SecSimpleDict
Where DictValue = left(@Value1,@myPos)
set @RetVal=@RetVal+isnull(@tmpStr, ' ')+ '; '
set @Value1=stuff(@Value1,1,@myPos+1, ' ')
set @myPos=charindex( ', ',@Value1)
end
set @tmpStr= ' '
select @tmpStr=DictCode from SecSimpleDict
where DictValue=@Value1
set @RetVal=@RetVal+isnull(@tmpStr, ' ')
return @RetVal
end


[解决办法]
CREATE function GetSimpleDic(@Value varchar(1000))
returns varchar(8000)
as
begin
declare @RetVal varchar(8000)
set @RetVal= ' '
set @Value = ', '+@Value+ ', '

select
@RetVal=@RetVal+isnull(DictCode, ' ')+ '; '
from
SecSimpleDict
where
charindex( ', '+rtrim(DictValue)+ ', ',@Value)> 0

set @RetVal=left(@RetVal,len(RetVal)-1)


return @RetVal
end
go
[解决办法]
改正下:
CREATE function GetSimpleDic(@Value varchar(1000))
returns varchar(8000)
as
begin
declare @tmpStr varchar(300)
declare @Value1 varchar(1200)
declare @RetVal varchar(8000)
set @RetVal= ' '
Set @Value1=@Value
declare @myPos int
set @myPos=charindex( ', ',@Value1)
while @myPos> 0
begin
set @tmpStr= ' '

select @tmpStr=DictCode from SecSimpleDict
Where DictValue = left(@Value1,@myPos-1)
set @RetVal=@RetVal+isnull(@tmpStr, ' ')+ '; '
set @Value1=stuff(@Value1,1,@myPos+1, ' ')
set @myPos=charindex( ', ',@Value1)
end
set @tmpStr= ' '
select @tmpStr=DictCode from SecSimpleDict
where DictValue=@Value1
set @RetVal=@RetVal+isnull(@tmpStr, ' ')
return @RetVal
end


或者你原来的只改一个地方

Where DictValue = substring(@Value1,0,@myPos)
--〉
Where DictValue = substring(@Value1,1,@myPos-1)

[解决办法]
where charindex( ', '+列名+ ', ', ', '+@value+ ', ')> 0
[解决办法]
在用户定义函数中不支持使用EXEC()执行动态SQL语句,但是没有关系,可以用charindex解决楼主遇到的问题。
[解决办法]
只需要用charindex()就可以解決了

热点排行