SQL存储过程高效分割传入字符串方法!求更好的、更高效的方法!!!!!!!!

Dotar 2012-09-13 03:13:20


declare @next int
declare @ArrayLen int
declare @errorSun int
set @errorSun=0
BEGIN TRANSACTION--开始事务
set @ArrayLen=dbo.Get_StrArrayLength(@DFXStr,'$')
set @next=1
while @next<=@ArrayLen-2
begin
if(@Step=1)
update DFXCompSpread set RDFeedback=dbo.Get_StrArrayStrOfIndex(@DFXStr,'$',@next+2),rdchange=dbo.Get_StrArrayStrOfIndex(@DFXStr,'$',@next+1) where DFXCSID=dbo.Get_StrArrayStrOfIndex(@DFXStr,'$',@next)
else
update DFXCompSpread set DFXComComment=dbo.Get_StrArrayStrOfIndex(@DFXStr,'$',@next+2), DFMChange=dbo.Get_StrArrayStrOfIndex(@DFXStr,'$',@next+1) where DFXCSID=dbo.Get_StrArrayStrOfIndex(@DFXStr,'$',@next)


用 dbo.Get_StrArrayLength 发现字符串长了,更新起来特别慢,贴个串:
'5099$Pass$阿萨德发生的$5003$Pass$阿发的是发生 $5009$Pass$$5004$Pass$$5031$Pass$$5041$Pass$$5039$Pass$$5058$Pass$$5005$Pass$$5008$Pass$$5018$Pass$$5038$Pass$$5084$Pass$$5002$Pass$$5045$Pass$$5022$Pass$$5019$Pass$$5036$Pass$$5042$Pass$$5046$Pass$$5066$Pass$$5043$Pass$$5050$Pass$$5014$Pass$$5016$Pass$$5021$Pass$$5054$Pass$$5060$Pass$$5069$Pass$$5013$Pass$$5065$Pass$$5006$Pass$$5007$Pass$$5010$Pass$$5011$Pass$$5015$Pass$$5017$Pass$$5024$Pass$$5025$Pass$$5027$Pass$$5033$Pass$$5035$Pass$$5044$Pass$$5048$Pass$$5070$Pass$$5075$Pass$$5078$Pass$$5061$Pass$$5062$Pass$$5053$Pass$$5023$Pass$$5032$Pass$$5076$Pass$$5012$Pass$$5020$Pass$$5029$Pass$$5030$Pass$$5034$Pass$$5037$Pass$$5040$Pass$$5047$Pass$$5049$Pass$$5051$Pass$$5052$Pass$$5059$Pass$$5063$Pass$$5067$Pass$$5068$Pass$$5071$Pass$$5072$Pass$$5073$Pass$$5074$Pass$$5077$Pass$$5079$Pass$$5080$Pass$$5082$Pass$$5083$Pass$$5086$Pass$$5087$Pass$$5090$Pass$$5091$Pass$$5092$Pass$$5093$Pass$$5064$Pass$$5088$Pass$$5089$Pass$$5026$Pass$$5028$Pass$$5056$Pass$$5098$Pass$$5055$Pass$$5057$Pass$$5081$Pass$$5085$Pass$$5094$Pass$$5095$Pass$$5096$Pass$$5097$Pass$$'




谁有更好的sql分割串的方法!!!!!!!!求教!!!!!!
...全文
241 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
nvllin1992 2012-09-15
  • 打赏
  • 举报
回复
为什么我恢复的就不是代码格式的呢?

然后在你的存储过程里面就可以调用这个函数 select * from split(要分割的字符串,'用什么字符分割')
nvllin1992 2012-09-15
  • 打赏
  • 举报
回复
我的方法也是创建表值函数

ALTER FUNCTION [dbo].[Split]
(
@c VARCHAR(MAX) ,
@split VARCHAR(50)
)
RETURNS @t TABLE ( col VARCHAR(50) )
AS
BEGIN
WHILE ( CHARINDEX(@split, @c) <> 0 )
BEGIN
INSERT @t( col )
VALUES ( SUBSTRING(@c, 1, CHARINDEX(@split, @c) - 1) )
SET @c = STUFF(@c, 1, CHARINDEX(@split, @c), '')
END
INSERT @t( col ) VALUES ( @c )
RETURN
END
wackyboy 2012-09-14
  • 打赏
  • 举报
回复
靠 3 4 5 楼呢?
风一样的大叔 2012-09-14
  • 打赏
  • 举报
回复
--创建函数:


CREATE function [dbo].[SplitStr]
(
@SourceSql varchar(8000),
@StrSeprate varchar(100))
returns @temp table(F1 varchar(100)
)
as
begin
declare @ch as varchar(100)
set @SourceSql=@SourceSql+@StrSeprate
while(@SourceSql<>'')
begin
set @ch=left(@SourceSql,charindex(',',@SourceSql,1)-1)
insert @temp values(@ch)
set @SourceSql=stuff(@SourceSql,1,charindex(',',@SourceSql,1),'')
end
return
end


--应用(存储过程):

CREATE PROCEDURE [dbo].[UP_Student_GetListByStatus]
@StatusList varchar(max)
AS
SELECT [Student].*
FROM Student
WHERE
[Student].[PK_Status] IN (SELECT F1 FROM dbo.SplitStr(@StatusList,','))


像C#一样分割
whh764224646 2012-09-14
  • 打赏
  • 举报
回复
是吗?呵呵……
Dotar 2012-09-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
靠 3 4 5 楼呢?
[/Quote]

不知道 现在论坛变烂了,老看不全回复
Dotar 2012-09-13
  • 打赏
  • 举报
回复
更好的方法?
Dotar 2012-09-13
  • 打赏
  • 举报
回复
能谈谈这一串的精髓嘛?
[Quote=引用 4 楼 的回复:]

SQL code


CREATE function dbo.f_splitstr
(
@SourceSql varchar(8000),
@StrSeprate varchar(10)
)
returns @temp table(F1 varchar(200))
as
begin
declare @i int
set @SourceSq……
[/Quote]
Dotar 2012-09-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

不是分割慢.而是 你 循环需修改慢..
[/Quote]

那有什么好方法???????
  • 打赏
  • 举报
回复


CREATE function dbo.f_splitstr
(
@SourceSql varchar(8000),
@StrSeprate varchar(10)
)
returns @temp table(F1 varchar(200))
as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>''
insert @temp values(@SourceSql)
return
end


wackyboy 2012-09-13
  • 打赏
  • 举报
回复
dbo.Get_StrArrayLength 干什么用?
求字符串长度可以用 LEN(字符串) 来获取
Net攻城狮 2012-09-13
  • 打赏
  • 举报
回复
不是分割慢.而是 你 循环需修改慢..
Dotar 2012-09-13
  • 打赏
  • 举报
回复
沉的真快 ,我顶。。。。。。。。。。。。。。。。。。

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧