/*
功能:实现split功能的函数
*/create function dbo.fn_split 
(
@inputstr varchar(8000), 
@seprator varchar(10)
)
returns @temp table (a varchar(200))
as begin
declare @i intset @inputstr = rtrim(ltrim(@inputstr))
set @i = charindex(@seprator, @inputstr)while @i >= 1
begin
insert @temp values(left(@inputstr, @i - 1))set @inputstr = substring(@inputstr, @i + 1, len(@inputstr) - @i)
set @i = charindex(@seprator, @inputstr)
endif @inputstr <> '\'
insert @temp values(@inputstr)return 
end
go--调用declare @s varchar(1000)set @s='1,2,3,4,5,6,7,8,55'select * from dbo.fn_split(@s,',')drop function dbo.fn_split 

解决方案 »

  1.   

    ID         Label(该字段可以为空,也有可能是非规则的串如下) 
    ----------------------
    龟啊,人家的还是非规则的哦。。会不会不规则到有各种各样的符号在里面啊?嘿嘿```
      

  2.   

    2000版本。
    表b中的infoID是表a中的ID列的编号表a中的label列中有可能出现其他类型的符号。
      

  3.   

    --sql 2005中的实现.不过没看明白你如何同B表进行关联,我这里仍然只能用一临时表生成序号
    create table 表A(ID varchar(10), Label varchar(50))
    insert into 表A values('a1', ',中国,美国,日本,韩国') 
    insert into 表A values('a2', '汽车,飞机,,轮船,,') 
    insert into 表A values('a3', '天津,') 
    insert into 表A values('a4', '')
    goselect px = identity(int , 1, 1) , * into tmp from
    (
    SELECT A.id, B.Label
    FROM(
        SELECT id, [Label] = CONVERT(xml,'<root><v>' + REPLACE([Label], ',', '</v><v>') + '</v></root>') FROM 表A
    )A
    OUTER APPLY(
        SELECT Label = N.v.value('.', 'varchar(100)') FROM A.[Label].nodes('/root/v') N(v)
    )B
    )T where Label is not null and Label <> ''select * from tmpdrop table 表A,tmp/*
    px          id         Label
    ----------- ---------- ------
    1           a1         中国
    2           a1         美国
    3           a1         日本
    4           a1         韩国
    5           a2         汽车
    6           a2         飞机
    7           a2         轮船
    8           a3         天津(8 行受影响)
    */
      

  4.   

    --这里有2000和2005不同的分解方法,自己分解后同B表关联.
    分拆列值原著:邹建
    改编:爱新觉罗.毓华  2007-12-16  广东深圳有表tb, 如下:
    id          value
    ----------- -----------
    1           aa,bb
    2           aaa,bbb,ccc
    欲按id,分拆value列, 分拆后结果如下:
    id          value
    ----------- --------
    1           aa
    1           bb
    2           aaa
    2           bbb
    2           ccc1. 旧的解决方法
    SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b SELECT A.id, SUBSTRING(A.[values], B.id, CHARINDEX(',', A.[values] + ',', B.id) - B.id)
    FROM tb A, # B
    WHERE SUBSTRING(',' + A.[values], B.id, 1) = ','DROP TABLE #2. 新的解决方法 create table tb(id int,value varchar(30))
    insert into tb values(1,'aa,bb')
    insert into tb values(2,'aaa,bbb,ccc')
    go
    SELECT A.id, B.value
    FROM(
        SELECT id, [value] = CONVERT(xml,'<root><v>' + REPLACE([value], ',', '</v><v>') + '</v></root>') FROM tb
    )A
    OUTER APPLY(
        SELECT value = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/root/v') N(v)
    )BDROP TABLE tb/*
    id          value
    ----------- ------------------------------
    1           aa
    1           bb
    2           aaa
    2           bbb
    2           ccc(5 行受影响)
    */
      

  5.   

    create table tA(ID varchar(10), Label varchar(50))
    insert into tA values('a1', ',中国,美国,日本,韩国') 
    insert into tA values('a2', '汽车,飞机,,轮船,,') 
    insert into tA values('a3', '天津,') 
    insert into tA values('a4', '')
    go
    create table tb(ID varchar(2),Label varchar(10),InfoID varchar(10))
    insert tb select 
    'b1','中国','' union select  
    'b2','美国','' union select  
    'b3','日本','' union select  
    'b4','韩国','' union select  
    'b5','汽车','' union select  
    'b6','飞机','' union select  
    'b7','轮船','' union select  
    'b8','天津',''
    go
    create trigger trigger_u
    on ta
    for insert
    as
    begin
    update a
        set infoid = b.id
        from tb a
        right join inserted b on charindex(a.Label,b.Label) > 0
    end
    go
    select * from tb 
    /*
    ID   Label      InfoID     
    ---- ---------- ---------- 
    b1   中国         
    b2   美国         
    b3   日本         
    b4   韩国         
    b5   汽车         
    b6   飞机         
    b7   轮船         
    b8   天津         (所影响的行数为 8 行)
    */
    insert into tA values('a1', ',中国,美国,日本,韩国') 
    insert into tA values('a2', '汽车,飞机,,轮船,,') 
    insert into tA values('a3', '天津,') 
    insert into tA values('a4', '')
    select * from tb
    /*
    ID   Label      InfoID     
    ---- ---------- ---------- 
    b1   中国         a1
    b2   美国         a1
    b3   日本         a1
    b4   韩国         a1
    b5   汽车         a2
    b6   飞机         a2
    b7   轮船         a2
    b8   天津         a3(所影响的行数为 8 行)*/
    drop table ta,tb
     
      

  6.   


    --各种字符串分函数
    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
    select * from dbo.f_splitSTR('10.10.11','.')
    /*==============================================*/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
      

  7.   

    潇洒老乌龟的方向是正确的。但是还有点看不懂,
    旧的解决办法应该是2000拆分字符串的功能吧,然后下面新的解决办法是2005里面的拆分功能?无枪狙击手的代码功能应该是关联A和B中的数据吧。其实B表中的数据是不存在的,完全是由A表继承来的数据。也就是说B表的label都是由A表的Label字段拆分形成的。
      

  8.   


    无枪狙击手的代码功能应该是关联A和B中的数据吧。其实B表中的数据是不存在的,完全是由A表继承来的数据。也就是说B表的label都是由A表的Label字段拆分形成的。 
    ---
    哦,
      

  9.   

    其实楼上写的split函数我都在google到了,但是因为很菜,就是不会具体的应用。我就是想在SQL2000中给a表写个触发器能够调用自定义的split函数来实现上面的功能。
      

  10.   

    select * from f_splitstr(',中国,美国,,日本,韩国',',')
    where col<>''
    中国
    美国
    日本
    韩国
    把不规则的空去掉
      

  11.   


    --楼主一定要触发器?
    --这么执着?只有按楼主的要求写一下了。create table 表A(ID varchar(10), Label varchar(50))create table 表B(ID varchar(10),Label varchar(50),InfoID varchar(50))create trigger wsp_tr on 表A for insert
    as
    begin
    declare @id varchar(10),@label varchar(50)
    select @id=id,@label=label from inserted 
    if(len(replace(@label,' ',''))<>0)
    begin
    set @label=replace(@label+',',',,',',')
    declare @lab varchar(50)
    while(charindex(',',@label)>0)
    begin
    set @lab=substring(@label,1,charindex(',',@label)-1)
    set @label=substring(@label,charindex(',',@label)+1,len(@label))
    if(len(replace(@lab,' ',''))<>0)
    insert into 表B select 'b'+cast(isnull(max(stuff(id,1,1,'')),0)+1 as varchar),@lab,@id from 表B
    end
    end
    end--测试
    insert into 表A values('a1', ',中国,美国,日本,韩国') 
    insert into 表A values('a2', '汽车,飞机,,轮船,,') 
    insert into 表A values('a3', '天津,') 
    insert into 表A values('a4', '')--查看结果
    select * from 表B