日期:2014-05-17  浏览次数:20469 次

该语句如何优化?
--创建表(机构表)
CREATE TABLE [dbo].[Area](
[AreaTId] [int] NOT NULL,
[AreaName] [varchar](64) NOT NULL,
[MemberId] [varchar](384) NOT NULL,
 CONSTRAINT [PK_Area] PRIMARY KEY CLUSTERED 
(
[AreaTId] ASC
)) ON [PRIMARY]

insert into Area values(1000,'101','001')
insert into Area values(1002,'102','001001')
insert into Area values(1003,'103','001001001')
insert into Area values(1004,'201','002')
insert into Area values(1005,'202','002001')
insert into Area values(1006,'203','002002')
-- 数据很多,举例只添加几条


--如果传过来的值是 a002,b001,有可能传值特别多
--我要获取所有符合条件AreaTId
/*  1002得到其 memberID:001001.所以1000不属于他的机构
1002 102 001001
1003 103 001001001
1004 201 002
1005 202 002001
1006 203 002002
*/

select * from area where (MemberId LIKE (select MemberID from area where AreaTId='1002') +'%')
union all
select * from area where (MemberId LIKE ( select MemberID from Area where areaTId='1004') +'%')

如果传过来的值太多,语句好长,我应该怎么优化呢?

------解决方案--------------------
/*
功能说明:传入字符串跟分割符('''HE00000003'',''HE00000004'',''HE00000005'''),返回一个Table
*/
ALTER function [dbo].[fnSys_SplitString]
(
---字符串分割
@Str varchar(max), --传入的字符串
@SeprateStr varchar(10)--分隔符
)
Returns @temp table(Code varchar(100)) --返回一个Table
As 
Begin
Declare @i int
Set @Str=REPLACE(@str,'''','')
Set @Str =rtrim(ltrim(@Str ))
Set @i=charindex(@SeprateStr,@Str )
While @i>=1
Begin
Insert @temp values(left(@Str ,@i-1))
Set @Str =substring(@Str ,@i+1,len(@Str )-@i)
Set @i=charindex(@SeprateStr,@Str )
End
If @Str <>'' 
Insert @temp values(@Str )
Return 
End