CREATE FUNCTION dbo.f_GetStr
(
@s ntext,      --字符串列表
@pos int       --要获取的数据信息段
)RETURNS nvarchar(4000)
AS
BEGIN
IF @s IS NULL RETURN(NULL)
DECLARE @s1 nvarchar(4000),@i int,@j int

SELECT @i=1,@j=PATINDEX('%+%',@s)

WHILE @pos>1 AND @j>0

SELECT @pos=@pos-1,
@j=PATINDEX('%+%',SUBSTRING(@s,@i,4000))
,@i=@i+@j
RETURN(SUBSTRING(@s,@i,PATINDEX('%+%',SUBSTRING(@s,@i,4000)+'+')-1))
ENDdeclare @str varchar(200)
set @str='φ444.5mm×253.00m+φ247.7mm×1274.98m+φ241.3mm×3566.93m'
--set @str='φ444.5mm×253.00m+φ247.7mm×1274.98m'
select dbo.f_GetStr(@str,1) as a1
,dbo.f_GetStr(@str,2) as a2
,dbo.f_GetStr(@str,3) as a3
,dbo.f_GetStr(@str,4) as a4
,dbo.f_GetStr(@str,5) as a5 
godrop function [dbo].[f_GetStr]--楼主,我可以以加号分开,但不足的,没有为空

解决方案 »

  1.   

    数据库中表JP_JBSJBY的子段ztcx是这样的select dbo.f_GetStr(ztcx,1) as a1
    ,dbo.f_GetStr(ztcx,2) as a2
    ,dbo.f_GetStr(ztcx,3) as a3
    ,dbo.f_GetStr(ztcx,4) as a4
    ,dbo.f_GetStr(ztcx,5) as a5  from JP_JBSJBY
      

  2.   

    这位大虾很厉害啊我的这个要求也有点反常呵呵 也有人写的是这样的
    select  substring(ztcx,1,charindex('+',ztcx)) a1, substring(right(ztcx,len(ztcx)-charindex('+',ztcx)),1,charindex('+',right(ztcx,len(ztcx)-charindex('+',ztcx)))) a2, 
     substring(right(ztcx,len(ztcx)-charindex('+',ztcx)-charindex('+',right(ztcx,len(ztcx)-charindex('+',ztcx)))),1,charindex('+',right(ztcx,len(ztcx)-charindex('+',ztcx)-charindex('+',right(ztcx,len(ztcx)-charindex('+',ztcx)))))) a3,  right(ztcx,len(ztcx)-charindex('+',ztcx)-charindex('+',right(ztcx,len(ztcx)-charindex('+',ztcx)))-charindex('+',right(ztcx,len(ztcx)-charindex('+',ztcx)-charindex('+',right(ztcx,len(ztcx)-charindex('+',ztcx)))))) a4, substring(tgcx,1,charindex('+',tgcx)) b1,  substring(right(tgcx,len(tgcx)-charindex('+',tgcx)),1,charindex('+',right(tgcx,len(tgcx)-charindex('+',tgcx)))) b2,substring(right(tgcx,len(tgcx)-charindex('+',tgcx)-charindex('+',right(tgcx,len(tgcx)-charindex('+',tgcx)))),1,charindex('+',right(tgcx,len(tgcx)-charindex('+',tgcx)-charindex('+',right(tgcx,len(tgcx)-charindex('+',tgcx)))))) b3, right(tgcx,len(tgcx)-charindex('+',tgcx)-charindex('+',right(tgcx,len(tgcx)-charindex('+',tgcx)))-charindex('+',right(tgcx,len(tgcx)-charindex('+',tgcx)-charindex('+',right(tgcx,len(tgcx)-charindex('+',tgcx)))))) b4 from JP_JBSJBY但这样是其中某几项为空,但并不是后面的为空,这样取从左到右 怎么取 谁能告诉我啊~~~~谢谢
      

  3.   

    --測試
    declare @iCount int
    ,@iPos int
    ,@vGetString varchar(100)
    ,@vString varchar(100)
    ,@cDivisionChar char(1)
    ,@vSQLString varchar(500)
    ,@vInSQLString varchar(500)select @vString='φ444.5mm×253.00m+φ247.7mm×1274.98m+φ241.3mm×3566.93m'
    ,@cDivisionChar='+'
    if(right(rtrim(@vString),1)<>@cDivisionChar)
    begin
    set @vString=@vString+@cDivisionChar
    end
    select @iCount=len(@vString)-len(replace(@vString,@cDivisionChar,''))
    ,@iPos=1
    ,@vGetString=''select identity(int,1,1) ID into #Temp from sysobjects
    select @vSQLString='create table TableName('
    ,@vInSQLString='insert into TableName('
    select @vSQLString=@vSQLString+'a'+cast(id as varchar)+' varchar(50),' 
    ,@vInSQLString=@vInSQLString+'a'+cast(id as varchar)+','
    from #Temp where ID<=@iCount
    select @vSQLString=left(@vSQLString,len(@vSQLString)-1)+')'
    , @vInSQLString=left(@vInSQLString,len(@vInSQLString)-1)+')'
    exec(@vSQLString)
    drop table #Tempwhile(@iCount>=@iPos)
    begin
    select @vGetString=''''+
             replace(left(@vString,len(@vString)-1),@cDivisionChar,''',''')+''''
    ,@iPos=@iPos+1
    ,@vSQLString=@vInSQLString+' values('+@vGetString+')'
    exec(@vSQLString)
    end
    select * 
    from TableName
    --刪除測試環境
    drop table TableName
    /*
    --所影響的結果
    a1       a2 a3
    φ444.5mm×253.00m φ247.7mm×1274.98m φ241.3mm×3566.93m
    φ444.5mm×253.00m φ247.7mm×1274.98m φ241.3mm×3566.93m
    φ444.5mm×253.00m φ247.7mm×1274.98m φ241.3mm×3566.93m*/
      

  4.   

    --参考       declare @t table(col varchar(50))
    insert @t select 'aa,bb,cc'
    union all select 'AA,BB'
    union all select 'AAA'select * from @tdeclare @i int,@s varchar(1000)
    set @i=0
    select col into #t from @t
    while @@rowcount>0
    BEGIN
    select @i=@i+1
    set @s = 'alter table #t ADD  col'+cast(@i as varchar)+' varchar(10)'   --少了一个set
    exec(@s)set @s = 'update #t set col'+cast(@i as varchar) + 
    '='+'left(col,charindex('','',col+'','')-1),                 
    col = stuff(col,1,charindex('','',col+'',''),'''')
    where col>'''''
    exec(@s)
    end
    set @s = 'alter table #t drop column col,col'+cast(@i as varchar)
    exec(@s)
    select * from #t
    drop table #t--结果
    col1       col2       col3       
    ---------- ---------- ---------- 
    aa         bb         cc
    AA         BB         NULL
    AAA        NULL       NULL
      

  5.   

    create table tb(id int,aaa varchar(100))
    insert into tb select 1,'φ444.5mm×253.00m+φ247.7mm×1274.98m+φ241.3mm×3566.93m'
    insert into tb select 2,'φ444.5mm×253.00m+φ247.7mm×1274.98m+φ241.3mm×3566.93m+φ24e1.3mm×3566.93m+φ241.3mm×35w66.93m'
    go
    create function f_str1(@id int)
    returns varchar(8000)
    as 
    begin
    declare @sql varchar(8000)
    select @sql=''
    select @sql=@sql+replace(rtrim(ltrim(aaa)),'+',' ')+'' from tb where id=@id
    return  @sql
    end
    goselect dbo.f_str1(id) from tb
    go
    drop table tb
    drop function f_str1
      

  6.   

    邹斑竹的例子好像行的通,但我不知道对于我这个字段怎么写?
    能不能利用left(col,charindex('','',col+'','')-1)之类的 
    用一条sql语句实现:
    将用+号分割的部分,分为五个部分,如果没有五个部分,后面用Null来表示?谢谢各位帮忙的大虾了~~ !!