在sqlserver中,怎么把 带分割符的超长值分拆成多个值

披着虎皮 的石头 2014-01-08 05:53:15
/*************************************************************************************
* 根据带分割符的值,分拆成多个值,
输入 '1|2|3', '1' 返回1 2 3
**************************************************************************************/
CREATE Procedure up_Sys_getPart
@sStr varchar(4000) ='',
@sSplit varchar(1) =''
As
create table #A_getPart (Fld varchar(4000))

insert #A_getPart (Fld)
values (@sStr)
--------------开始查询--------------------------
select SUBSTRING(a.Fld, number, CHARINDEX(@sSplit, a.Fld +@sSplit, number) -number) as Fld
from #A_getPart a, master..spt_values
where number >=1 and number <=len(a.Fld)
and type ='p'
and substring(@sSplit +a.Fld, number, 1) =@sSplit

drop table #A_getPart
GO

使用上面的存储过程,输入较短的字符,如1,2,,3 能处理。
但遇到如下面的超长字符值时,只取得22小段,没有完全取得,怎么回事:
20140100028|20140100027|20140100026|20140100026|20140100026|20140100024|20140100024|20140100023|20140100022|20140100022|20140100021|20140100020|20140100019|20140100019|20140100019|20140100019|20140100017|20140100017|20140100016|20140100015|20140100015|20140100014|20140100013|20140100013|20140100013|20140100013|20140100011|20140100011|20140100010|20140100009|20140100009|20140100009|20140100009|20140100009|20140100008|20131200122|20131200122|20131200122|20131200122|20131200122|20131200122|20131200120|20131200120|20131200120|20131200120|20131200118|20131200105|20131200105|20131200096|20131200091|20131200095|20131200084|20131200084|20131200084|20131200084|20131200070|20131200053|20131200048|20131200048|20131200041|20131200010|20131200010|20131200010|20131200010|20131200010|20131200010|20131200010|20131200010|20131200010|20131200010|20131200010|20131200010|20131200010|20131200010|20131200010|20131200010|20131200010|20131200010|20131100055|20131100055|20131100055|20131100055|20131100055|20131100055|20131100055

...全文
184 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
giftzheng 2014-01-09
  • 打赏
  • 举报
回复
varchar(8000) 不够的话 只好用text对付它
發糞塗牆 2014-01-09
  • 打赏
  • 举报
回复
所以我有备注,如果没有max就换8000,还有自己弄一个参照表
tcmakebest 2014-01-08
  • 打赏
  • 举报
回复
楼主如果用sql2005及以上,可以这么办:
declare @para nvarchar(max) = '20140100028|20140100027'
declare @x xml = '<id>' + REPLACE(@para,'|','</id><id>') + '</id>'
select T.d.value('.','varchar(100)') as value from @x.nodes('/*') as T(D)
  • 打赏
  • 举报
回复
master..spt_values 替换掉,增加一个表,表内数据有8000条,值从1到8000。
水族杰纶 2014-01-08
  • 打赏
  • 举报
回复
1)@sStr varchar(4000) 长度改为varchar(8000)或者varchar(max) 2)不使用master..spt_values 自己构建辅助表 比如10W条序号表,根据实际需要 master..spt_values 中type='P'只有2048条
  • 打赏
  • 举报
回复
max不能改,我是sqlserver2000。 是不是里面的处理函数参数有255个字符限制
發糞塗牆 2014-01-08
  • 打赏
  • 举报
回复
CREATE Procedure up_Sys_getPart @sStr varchar(max) ='',--如果没有max就用8000 @sSplit varchar(1) ='' As create table #A_getPart (Fld varchar(max))--如果没有max就用8000 insert #A_getPart (Fld) values (@sStr) --------------开始查询-------------------------- select SUBSTRING(a.Fld, number, CHARINDEX(@sSplit, a.Fld +@sSplit, number) -number) as Fld from #A_getPart a, master..spt_values where number >=1 and number <=len(a.Fld) and type ='p' and substring(@sSplit +a.Fld, number, 1) =@sSplit drop table #A_getPart GO

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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