首页 > 代码库 > 字符串分割函数--拆分成多行(转)

字符串分割函数--拆分成多行(转)

--字符串拆分成行
declare @str varchar(8000
set @str = a1,b1,c2,d1,e3,f5 
--,换成 union all select
set @str = select  name=‘‘‘+replace(@str,,,‘‘‘ union all select ‘‘‘)+‘‘‘‘ 
exec(@str)

/*name 
---- 
a1
b1
c2
d1
e3
f5
*/

 

 

--字符串分割函数--拆分成多行
create function f_splitstr(@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp 
table(F1 varchar(100))
as
begin 
declare @i int 
set @SourceSql=rtrim(ltrim(@SourceSql)) 
set @i=charindex(@StrSeprate,@SourceSql
while @i>=1 
begin  
insert @temp values(left(@SourceSql,@i-1))  
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)  
set @i=charindex(@StrSeprate,@SourceSql) end if @SourceSql<>‘‘     
insert @temp values(@SourceSql
return end

--示例
declare @SourceSql varchar(8000),@StrSeprate varchar(10)
select @SourceSql=1,2,3,4,5,@StrSeprate=,
select * from dbo.f_splitstr(@SourceSql,@StrSeprate)

 

 


--结果
/*
F1                                                                                               
--
1
2
3
4
5
(所影响的行数为 5 行)
*/

 

 

 

 

 

-- XML  

DECLARE @str VARCHAR(4000)
SET @str12,13,14,16,44,46,47
Declare @x XML 
select @x cast(<A>replace(@str,,,</A><A>)</A>‘ as xml)
      
select t.value(.intas inVal
from @x.nodes(/Aas x(t)

/*
inVal:
12
13
14
16
44
46
47

*/ 

 

 DECLARE @str VARCHAR(4000)

SET @str12,大幅度,14,16,高度,46,47
Declare @x XML 
select @x cast(<A>replace(@str,,,</A><A>)</A>‘ as xml)
      
select t.value(.VARCHAR(40)as inVal
from @x.nodes(/Aas x(t)

/*
inVal
----------------------------------------
12
大幅度
14
16
高度
46
47

(7 行受影响)
*/

 

 alter procedure Proc_InsertSendApi(

    @userid       int,
    @sendid       int,
    @Phone        nvarchar(max),
    @message      nvarchar(300),
    @senttime     datetime,
    @batchid      bigint
)
as
begin
    declare @str nvarchar(max)
    set @str @Phone
    declare @x     xml,
            @p     varchar(11)
    
    select @x cast(<A>‘ replace(@str, ,‘, </A><A>‘) </A>‘ as xml)     
    
    begin
        set arithabort on
        
        insert into Send_Api
          (
            UserId,
            PartnersCode,
            SendId,
            Phone,
            [Message],
            SentTime,
            CreateTime,
            BatchId
          )
        select @userid, 35, @sendid, t.value(.‘, varchar(11)‘), @message, @senttime, 
               getdate(), @batchid
        from   @x.nodes(/A‘) as x(t)
    end
end

 

表:
Id    Name    Category
1    哈利波特    奇幻,外文,魔法
2    神雕俠侶    武俠,現代
3    西遊記    奇幻,古文

结果:

1    哈利波特    奇幻
1    哈利波特    外文
1    哈利波特    魔法
2    神雕俠侶    武俠
2    神雕俠侶    現代
3    西遊記    奇幻
3    西遊記    古文

CREATE FUNCTION fnConvertXmlToTable(@ID INT)
RETURNS @Table TABLE(Category NVARCHAR(10))
AS
BEGIN
    DECLARE @Xml XML;
    --将逗号 Replace 成</Category><Category>,最前面加入<Category>及最后面再加入</Category>
    SELECT TOP 1 @Xml =CAST(<Category> + REPLACE(Category , ,</Category><Category>+ </Category> AS XML)
    FROM dbo.Books
    WHERE ID = @ID
    INSERT INTO @Table(Category)
    SELECT col.value(.nvarchar(10))
    FROM @Xml.nodes(/Category) Doc(col)
    RETURN
END



SELECT a.ID, a.Name, b.Category FROM Books a
CROSS APPLY dbo.fnConvertXmlToTable(a.ID) b
ORDER BY a.ID

字符串分割函数--拆分成多行(转)