现在有一个字段是K602-013-00,我想把这三段拆分
字段.split('-') ?

解决方案 »

  1.   

    拆分表:--> --> (Roy)生成測試數據
     
    if not object_id('Tab') is null
        drop table Tab
    Go
    Create table Tab([Col1] int,[COl2] nvarchar(5))
    Insert Tab
    select 1,N'a,b,c' union all
    select 2,N'd,e' union all
    select 3,N'f'
    Go--SQL2000用辅助表:
    if object_id('Tempdb..#Num') is not null
        drop table #Num
    go
    select top 100 ID=Identity(int,1,1) into #Num from syscolumns a,syscolumns b
    Select 
        a.Col1,COl2=substring(a.Col2,b.ID,charindex(',',a.Col2+',',b.ID)-b.ID) 
    from 
        Tab a,#Num b
    where
        charindex(',',','+a.Col2,b.ID)=b.ID --也可用 substring(','+a.COl2,b.ID,1)=','
    --2000不使用辅助表
    Select
        a.Col1,COl2=substring(a.Col2,b.number,charindex(',',a.Col2+',',b.number)-b.number) 
    from 
        Tab a join master..spt_values  b 
        ON B.type='p' AND B.number BETWEEN 1 AND LEN(A.col2)
    where
         substring(','+a.COl2,b.number,1)=','
    SQL2005用Xml:select 
        a.COl1,b.Col2
    from 
        (select Col1,COl2=convert(xml,'<root><v>'+replace(COl2,',','</v><v>')+'</v></root>') from Tab)a
    outer apply
        (select Col2=C.v.value('.','nvarchar(100)') from a.COl2.nodes('/root/v')C(v))b
    SQL05用CTE:;with roy as 
    (select Col1,COl2=cast(left(Col2,charindex(',',Col2+',')-1) as nvarchar(100)),Split=cast(stuff(COl2+',',1,charindex(',',Col2+','),'') as nvarchar(100)) from Tab
    union all
    select Col1,COl2=cast(left(Split,charindex(',',Split)-1) as nvarchar(100)),Split= cast(stuff(Split,1,charindex(',',Split),'') as nvarchar(100)) from Roy where split>''
    )
    select COl1,COl2 from roy order by COl1 option (MAXRECURSION 0)生成结果:
    /*
    Col1        COl2
    ----------- -----
    1           a
    1           b
    1           c
    2           d
    2           e
    3           f
    */
      

  2.   

    declare @field nvarchar(15)set @field = 'K602-013-00'select parsename(replace(@field,'-','.'),1)
    union all
    select parsename(replace(@field,'-','.'),2)
    union all
    select parsename(replace(@field,'-','.'),3)--00
    --013
    --K602
      

  3.   

    低于4个'-'用parsename函数 
    否则用2楼
      

  4.   

    楼主的意思是横着截取吧  参考--轉老大
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_GetStr]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_GetStr]
    GO
    --分段截取函数
    CREATE FUNCTION dbo.f_GetStr(
    @s varchar(8000),      --包含多个数据项的字符串
    @pos int,             --要获取的数据项的位置
    @split varchar(10)     --数据分隔符
    )RETURNS varchar(100)
    AS
    BEGIN
        IF @s IS NULL RETURN(NULL)
        DECLARE @splitlen int
        SELECT @splitlen=LEN(@split+'a')-2
        WHILE @pos>1 AND CHARINDEX(@split,@s+@split)>0
            SELECT @pos=@pos-1,
                @s=STUFF(@s,1,CHARINDEX(@split,@s+@split)+@splitlen,'')
        RETURN(ISNULL(LEFT(@s,CHARINDEX(@split,@s+@split)-1),''))
    END
    GOselect dbo.f_GetStr('2∮11∮10∮09∮10∮13∮786∮91.93∮69∮100.00 ',7,'∮')
    /*
    ----------------------------------------------------------------------------------------------------
    786(1 個資料列受到影響)
      

  5.   

    --各种字符串分函数if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_splitSTR]
    GO--3.2.1 循环截取法
    CREATE FUNCTION f_splitSTR(
    @s   varchar(8000),   --待分拆的字符串
    @split varchar(10)     --数据分隔符
    )RETURNS @re TABLE(col varchar(100))
    AS
    BEGIN
        DECLARE @splitlen int
        SET @splitlen=LEN(@split+'a')-2
        WHILE CHARINDEX(@split,@s)>0
        BEGIN
            INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))
            SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
        END
        INSERT @re VALUES(@s)
        RETURN
    END
    GO
    /*==============================================*/if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_splitSTR]
    GO--3.2.3.1 使用临时性分拆辅助表法
    CREATE FUNCTION f_splitSTR(
    @s   varchar(8000),  --待分拆的字符串
    @split varchar(10)     --数据分隔符
    )RETURNS @re TABLE(col varchar(100))
    AS
    BEGIN
        --创建分拆处理的辅助表(用户定义函数中只能操作表变量)
        DECLARE @t TABLE(ID int IDENTITY,b bit)
        INSERT @t(b) SELECT TOP 8000 0 FROM syscolumns a,syscolumns b    INSERT @re SELECT SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID)
        FROM @t
        WHERE ID<=LEN(@s+'a') 
            AND CHARINDEX(@split,@split+@s,ID)=ID
        RETURN
    END
    GO/*==============================================*/if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_splitSTR]
    GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tb_splitSTR]') and objectproperty(id,N'IsUserTable')=1)
    drop table [dbo].[tb_splitSTR]
    GO--3.2.3.2 使用永久性分拆辅助表法
    --字符串分拆辅助表
    SELECT TOP 8000 ID=IDENTITY(int,1,1) INTO dbo.tb_splitSTR
    FROM syscolumns a,syscolumns b
    GO--字符串分拆处理函数
    CREATE FUNCTION f_splitSTR(
    @s     varchar(8000),  --待分拆的字符串
    @split  varchar(10)     --数据分隔符
    )RETURNS TABLE
    AS
    RETURN(
        SELECT col=CAST(SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID) as varchar(100))
        FROM tb_splitSTR
        WHERE ID<=LEN(@s+'a') 
            AND CHARINDEX(@split,@split+@s,ID)=ID)
    GO
    /*==============================================*/if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_splitSTR]
    GO
      

  6.   

    只有三个 - 的 用parsename可以
      

  7.   

    为Sql Server 添加字符分割函数
      函数体如下: create   function   f_split(@c   varchar(2000),@split   varchar(2))   
      returns   @t   table(col   varchar(20))   
      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   
      go   使用示例:select   *   from   dbo.f_split('dfkd,dfdkdf,dfdkf,dffjk',',')转自:http://wuxusheng1979.spaces.live.com/blog/cns!ac2a2089726dbb1f!127.entry
      

  8.   

    /****** 对象:  UserDefinedFunction [dbo].[Get_StrArrayLength]    脚本日期: 01/26/2010 15:47:47 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE function [dbo].[Get_StrArrayLength]  (  @str varchar(1024), --要分割的字符串 @split varchar(10) --分隔符号 )  returns int  as  begin  declare @location int  declare @start int  declare @length int  declare @len intset @len=len(@split)  --add set @str=ltrim(rtrim(@str))  set @location=charindex(@split,@str)  set @length=1  while @location<>0  begin  set @start=@location+@len  set @location=charindex(@split,@str,@start)  set @length=@length+1  end  return @length  end
    GO
    /****** 对象:  UserDefinedFunction [dbo].[Get_StrArrayStrOfIndex]    脚本日期: 01/26/2010 15:47:47 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE function [dbo].[Get_StrArrayStrOfIndex]  (  @str varchar(1024), --要分割的字符串 @split varchar(10), --分隔符号 @index int --取第几个元素 )  returns varchar(1024)  as  begin  declare @location int  declare @start int  declare @next int  declare @seed int   set @str=ltrim(rtrim(@str))  set @start=1  set @next=1  set @seed=len(@split)   set @location=charindex(@split,@str)  while @location<>0 and @index>@next  begin  set @start=@location+@seed  set @location=charindex(@split,@str,@start)  set @next=@next+1  end  if @location =0 select @location =len(@str)+1  --这儿存在两种情况:、字符串不存在分隔符号2、字符串中存在分隔符号,跳出while循环后,@location为,那默认为字符串后边有一个分隔符号。  return substring(@str,@start,@location-@start)  end
    GO