if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([col] varchar(16))
insert [tb]
select '中国_哈尔滨_aaa' union all
select '加拿大_温哥华_bb' union all
select '朝鲜_汉城_cccc'select * from [tb]select substring(col,charindex('_',col)+1,charindex('_',right(col,len(col)-charindex('_',col)))-1)
from tb
/*
------
哈尔滨
温哥华
汉城
*/
select right(col,charindex('_',reverse(col))-1)
from tb
/*
-----
aaa
bb
cccc
*/

解决方案 »

  1.   

    create table tb(s varchar(50))
    insert into tb select '中国_哈尔滨_AAA'
    insert into tb select '加拿大_温哥华_BB'
    insert into tb select '朝鲜_汉城_CCCC'
    --1
    select s,substring(s,charindex('_',s)+1,len(s)-charindex('_',reverse(s))-charindex('_',s))from tb
    --2
    select s,right(s,charindex('_',reverse(s))-1) from tbs s2
    中国_哈尔滨_AAA 哈尔滨
    加拿大_温哥华_BB 温哥华
    朝鲜_汉城_CCCC 汉城
    s s2
    中国_哈尔滨_AAA AAA
    加拿大_温哥华_BB BB
    朝鲜_汉城_CCCC CCCC
      

  2.   

    if object_id('[tb]') is not null 
    drop table [tb]
    go
    create table [tb]([col] varchar(16))
    insert [tb]
    select '中国_哈尔滨_aaa' union all
    select '加拿大_温哥华_bb' union all
    select '朝鲜_汉城_cccc'
    select cast(parsename(replace(col, '_', '.'),2) as varchar(32))
    , cast(parsename(replace(col, '_', '.'),1) as varchar(32))
    from tb
    /*
    (3 行受影响)
                                     
    -------------------------------- --------------------------------
    哈尔滨                              aaa
    温哥华                              bb
    汉城                               cccc(3 行受影响)
    */
      

  3.   

    这个我觉得最好用函数来实现
    create function dbo.MidString (@string nvarchar(100))
    returns nvarchar(100)
    as
    begin
      declare @rtn nvarchar(100)
      declare @split1 tinyint
      declare @split2 tinyint
      set @split1=charindex('_',@string)+1
      set @split2=charindex('_',@string,@split1)
      return substring(@string,@split1,@split2-@split1)
    endcreate function dbo.LastString (@string nvarchar(100))
    returns nvarchar(100)
    as
    begin
      declare @rtn nvarchar(100)
      declare @split1 tinyint
      declare @split2 tinyint
      set @split1=charindex('_',@string)
      set @string=stuff(@string,@split1,1,'')
      set @split2=charindex('_',@string)
      return stuff(@string,1,@split2,'')
    end示例代码:
    select dbo.MidString(字符字段)--得到中间部分字符串
    select dbo.LastString(字符字段)--得到后部分字符串