物料编码 备注
R0116011493 R608 R609
A0116012226 A07 A33 D55
“备注”里数据值之间是用空格隔开的,现要实现截取后分行显示存入表T1中,如下结果
T1:
物料编码 备注
R0116011493 R608
R0116011493 R609
A0116012226 A07
A0116012226 A33
A0116012226 D55请给出详细代码,谢了~
R0116011493 R608 R609
A0116012226 A07 A33 D55
“备注”里数据值之间是用空格隔开的,现要实现截取后分行显示存入表T1中,如下结果
T1:
物料编码 备注
R0116011493 R608
R0116011493 R609
A0116012226 A07
A0116012226 A33
A0116012226 D55请给出详细代码,谢了~
sl:TStringList;begin
sl:=TStringList.Create;
Sl.DelimitedText:='是我的 是他的 同一个';
For i:=1 to Sl.Count-1 do
begin
//接收返回结果
Reslt:=sl.Strings[0]+' '+Sl.Strings[i];//是我的 是他的
//是我的 同一个
end;
create function f_split(@SourceSql varchar(8000))
returns @temp table(a varchar(100))
as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(',',@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(',',@SourceSql)
end
if @SourceSql<>','
insert @temp values(@SourceSql)
return
end
这样我们就会分成5条记录,因为我的要求是一个listbox中item[i]其中最小的说明他的排序在最前头,同时排序是但SEQ的降序排列。所以在这个查询中我用row_number()over(order by indexno desc) as seq得出了他的顺序号如下seq indexno SplitName1 4 5
2 3 4
3 2 3
4 1 2
5 0 1
然后就是对这个结果进行操作咯如 --设置选择商品为推荐并按传入的降序将商品推荐排序
update zp_auction_mst
set ishot=1,hotseq = b.seq
from zp_auction_mst a,
(select row_number()over(order by indexno desc) as seq ,* from recurrentsplit(@AuctionID,',',0,0)) as b
where a.auctionid= b.splitName
搞定,就是这么简单了。CREATE FUNCTION [dbo].[RecurrentSplit]
(
@nvStr nvarchar(2000) --需要分割字符串
,@vSeparte varchar(50) --分割字符串
,@iIsHaveSeparte int --是否显示字符串
,@iIsBefore int --是否是后面的分割符(分割字符分割的顺序)
)
RETURNS @Split table
(
IndexNo int default(0) --流水号
,SplitName nvarchar(1000) --分割后字符串
)
AS
BEGIN
if(charindex(@vSeparte,@nvStr)<=0) --处理在整个字符串里都没有要分割,也就是字符串本身
begin
insert into @Split(SplitName) values(@nvStr)
return
end
declare @iSeparteLen int
,@iEndHave int --最后几个字符串是否是分割字符
,@iStartHave int --前面几个字符串是否是分割字符
select @iSeparteLen=len(@vSeparte)
,@iStartHave=0
,@iEndHave=0
,@iIsHaveSeparte=case when @iIsHaveSeparte is null --默认值
then 0
else @iIsHaveSeparte
end
,@iIsBefore=case when @iIsBefore is null --默认值
then 0
else @iIsBefore
end
if(@iIsBefore=1) --只有在处理前面字符串分割时才用
begin
if(left(@nvStr,@iSeparteLen)<>@vSeparte)--处理前面几个分割字符一定是分割字符,不是就加
begin
select @nvStr=@vSeparte+@nvStr
,@iStartHave=1
end
end
if(right(@nvStr,@iSeparteLen)<>@vSeparte)--处理最后几个分割字符一定是分割字符,不是就加
begin
select @nvStr=@nvStr+@vSeparte
,@iEndHave=1
end; --分号一定不能少,因为用了with,是用公用表达式,在其前面一定要加;
with CharCET(CharStr,StrLen,IndexNo)
as
(
select substring(@nvStr,0
,case when @iIsBefore=0 then charindex(@vSeparte,@nvStr)+@iSeparteLen
else charindex(@vSeparte,@nvStr,charindex(@vSeparte,@nvStr)+@iSeparteLen) end
) CharStr
,case when @iIsBefore=0 then charindex(@vSeparte,@nvStr)
else charindex(@vSeparte,@nvStr,charindex(@vSeparte,@nvStr)+@iSeparteLen) end StrLen
,0 IndexNo --第一次初始化
union all
select substring(@nvStr
,case when @iIsBefore=0 then StrLen+@iSeparteLen
else StrLen end
,charindex(@vSeparte,@nvStr,StrLen+@iSeparteLen)-StrLen) CharStr
,charindex(@vSeparte,@nvStr,StrLen+@iSeparteLen) StrLen
,IndexNo+1 IndexNo --进行递归分割字符串
from CharCET
where StrLen<len(@nvStr)-@iSeparteLen --处理递归结束语句,也就是不要让其生成无限弟归下去
)
insert into @Split(IndexNo,SplitName)
select IndexNo,case when @iIsHaveSeparte=0
then replace(CharStr,@vSeparte,'')
else CharStr
end CharStr
from CharCET
option(maxrecursion 0)
if(@iIsHaveSeparte=1) --是否显示分割字符串
begin
update @Split --处理前面的分割字符串
set SplitName=case when @iStartHave=1
then replace(SplitName,@vSeparte,'')
else SplitName
end
where IndexNo = 0 update @Split --处理后面的分割字符串
set SplitName=case when @iEndHave=1
then replace(SplitName,@vSeparte,'')
else SplitName
end
where IndexNo = (select Max(IndexNo) from @Split)
end
RETURN
END