• 字符串分割函数拆分成多行


    --字符串拆分成行
    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 @str= '12,13,14,16,44,46,47'
    Declare @x XML 
    select @x = cast('<A>'+ replace(@str,',','</A><A>')+ '</A>' as xml)
          
    select t.value('.''int'as inVal
    from @x.nodes('/A'as x(t)

    /*
    inVal:
    12
    13
    14
    16
    44
    46
    47

    */ 

     DECLARE @str VARCHAR(4000)

    SET @str= '12,大幅度,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('/A'as 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 @userid35@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
     

  • 相关阅读:
    dockerk个人学习(0)
    ubuntu编译python源码的坑
    查找大目录
    ubuntu 远程gui显示
    paramiko模块
    python open和file的区别
    python type metaclass
    python 生成器 迭代器 yiled
    博客暂停更新,请移步新主页
    win10禁用自动更新服务
  • 原文地址:https://www.cnblogs.com/zengxiangzhan/p/1638171.html
Copyright © 2020-2023  润新知