SQL脚本整理系列一 分隔函数

系统 1451 0

原来效果:

        
          fName    Scroe

王某某    
        
        
          101
        
        ,
        
          102
        
        ,
        
          109
        
        
          

李某某    
        
        
          102
        
        ,
        
          103
        
        
          

王某某    
        
        
          103
        
        
          

李某某    

李某某    
        
        
          101
        
        ,
        
          102
        
        ,
        
          103
        
        
          

王某某    
        
        
          222
        
      

执行后效果:

        
          name    score

李某某    
        
        
          101
        
        
          

李某某    
        
        
          102
        
        
          

李某某    
        
        
          103
        
        
          

王某某    
        
        
          101
        
        
          

王某某    
        
        
          102
        
        
          

王某某    
        
        
          103
        
        
          

王某某    
        
        
          109
        
        
          

王某某    
        
        
          222
        
      

--基础数据表创建

          
            IF
          
          
            OBJECT_ID
          
          (
          
            '
          
          
            Test1
          
          
            '
          
          ) 
          
            >
          
          
            0
          
          
            DROP
          
          
            TABLE
          
          
             dbo.Test1




          
          
            CREATE
          
          
            TABLE
          
          
             Test1

    (

      fName 
          
          
            NVARCHAR
          
          (
          
            10
          
          
            ) ,

      Scroe 
          
          
            VARCHAR
          
          (
          
            50
          
          
            )

    );




          
          
            INSERT
          
          
              dbo.Test1

        ( fName, Scroe )


          
          
            VALUES
          
            ( N
          
            '
          
          
            王某某
          
          
            '
          
          , 
          
            --
          
          
             fName - nvarchar(10)
          
          
            '
          
          
            101,102,109
          
          
            '
          
          
            --
          
          
             Scroe - varchar(50)
          
          
                      )


          
          
            INSERT
          
          
              dbo.Test1

        ( fName, Scroe )


          
          
            VALUES
          
            ( N
          
            '
          
          
            李某某
          
          
            '
          
          , 
          
            --
          
          
             fName - nvarchar(10)
          
          
            '
          
          
            102,103
          
          
            '
          
          
            --
          
          
             Scroe - varchar(50)
          
          
                      )


          
          
            INSERT
          
          
              dbo.Test1

        ( fName, Scroe )


          
          
            VALUES
          
            ( N
          
            '
          
          
            王某某
          
          
            '
          
          , 
          
            --
          
          
             fName - nvarchar(10)
          
          
            '
          
          
            103
          
          
            '
          
          
            --
          
          
             Scroe - varchar(50)
          
          
                      )


          
          
            INSERT
          
          
              dbo.Test1

        ( fName, Scroe )


          
          
            VALUES
          
            ( N
          
            '
          
          
            李某某
          
          
            '
          
          , 
          
            --
          
          
             fName - nvarchar(10)
          
          
            ''
          
          
            --
          
          
             Scroe - varchar(50)
          
          
                      )


          
          
            INSERT
          
          
              dbo.Test1

        ( fName, Scroe )


          
          
            VALUES
          
            ( N
          
            '
          
          
            李某某
          
          
            '
          
          , 
          
            --
          
          
             fName - nvarchar(10)
          
          
            '
          
          
            101,102,103
          
          
            '
          
          
            --
          
          
             Scroe - varchar(50)
          
          
                      )

 
          
          
            INSERT
          
          
              dbo.Test1

        ( fName, Scroe )


          
          
            VALUES
          
            ( N
          
            '
          
          
            王某某
          
          
            '
          
          , 
          
            --
          
          
             fName - nvarchar(10)
          
          
            '
          
          
            222
          
          
            '
          
          
            --
          
          
             Scroe - varchar(50)
          
          
                      ) 

          

          

 
          
          
            SELECT
          
          
            *
          
          
            FROM
          
          
             Test1

          
          
          
            --
          
          
            DECLARE @Scroe VARCHAR(max)
          
        
View Code

--创建分隔函数

          
             1
          
          
            IF
          
          
            OBJECT_ID
          
          (
          
            '
          
          
            getSplitResult
          
          
            '
          
          ) 
          
            >
          
          
            0
          
          
             2
          
          
            DROP
          
          
            FUNCTION
          
          
             getSplitResult


          
          
             3
          
          
            GO
          
          
             4
          
          
             5
          
          
            /*
          
          
             6
          
          
            分隔函数


          
          
             7
          
          
             8
          
          
            */
          
          
             9
          
          
            10
          
          
            CREATE
          
          
            FUNCTION
          
          
             dbo.getSplitResult


          
          
            11
          
          
                (


          
          
            12
          
          
            @SourceObject
          
          
            VARCHAR
          
          (
          
            MAX
          
          ) ,
          
            --
          
          
            源对象
          
          
            13
          
          
            @Split
          
          
            VARCHAR
          
          (
          
            1
          
          ) 
          
            =
          
          
            '
          
          
            ,
          
          
            '
          
          
            --
          
          
            分隔参数
          
          
            14
          
          
                )


          
          
            15
          
          
            --
          
          
            返回一个表
          
          
            16
          
          
            RETURNS
          
          
            @tb
          
          
            TABLE
          
           ( score 
          
            VARCHAR
          
          (
          
            10
          
          
            ) )


          
          
            17
          
          
            AS
          
          
            18
          
          
            BEGIN
          
          
            19
          
          
            --
          
          
            不含分隔符
          
          
            20
          
          
            IF
          
          
            CHARINDEX
          
          (
          
            @Split
          
          , 
          
            @SourceObject
          
          ) 
          
            =
          
          
            0
          
          
            21
          
          
            INSERT
          
          
            @tb
          
          
            22
          
          
                                ( score )


          
          
            23
          
          
            VALUES
          
            ( 
          
            @SourceObject
          
          
            --
          
          
             score - varchar(10)
          
          
            24
          
          
                                  );


          
          
            25
          
          
            26
          
          
            WHILE
          
           ( 
          
            CHARINDEX
          
          (
          
            @Split
          
          , 
          
            @SourceObject
          
          ) 
          
            >
          
          
            0
          
          
             )


          
          
            27
          
          
            BEGIN
          
          
            28
          
          
            --
          
          
            插入数据
          
          
            29
          
          
            INSERT
          
          
            @tb
          
          
            30
          
          
                                    ( score


          
          
            31
          
          
                                    )


          
          
            32
          
          
            VALUES
          
            ( 
          
            SUBSTRING
          
          (
          
            @SourceObject
          
          , 
          
            0
          
          
            ,


          
          
            33
          
          
            CHARINDEX
          
          (
          
            @Split
          
          , 
          
            @SourceObject
          
          ))  
          
            --
          
          
             score - varchar(10)
          
          
            34
          
          
                                    );


          
          
            35
          
          
            36
          
          
            SET
          
          
            @SourceObject
          
          
            =
          
          
            RIGHT
          
          (
          
            @SourceObject
          
          
            ,


          
          
            37
          
          
            LEN
          
          (
          
            @SourceObject
          
          
            )


          
          
            38
          
          
            -
          
          
            CHARINDEX
          
          (
          
            @Split
          
          , 
          
            @SourceObject
          
          
            )) 


          
          
            39
          
          
            40
          
          
            IF
          
           ( 
          
            CHARINDEX
          
          (
          
            @Split
          
          , 
          
            @SourceObject
          
          ) 
          
            =
          
          
            0
          
          
            41
          
          
            AND
          
          
            LEN
          
          (
          
            @SourceObject
          
          ) 
          
            <>
          
          
            0
          
          
            42
          
          
                               )


          
          
            43
          
          
            INSERT
          
          
            @tb
          
          
            44
          
          
                                        ( score )


          
          
            45
          
          
            VALUES
          
            ( 
          
            @SourceObject
          
          
            --
          
          
             score - varchar(10)
          
          
            46
          
          
                                          );


          
          
            47
          
          
            END
          
          
            48
          
          
            49
          
          
            RETURN
          
          
            50
          
          
            END
          
          
            51
          
        
View Code

--创建存储过程

          
            IF
          
          
            OBJECT_ID
          
          (
          
            '
          
          
            sp_SplitResult
          
          
            '
          
          ) 
          
            >
          
          
            0
          
          
            DROP
          
          
            PROC
          
          
             sp_SplitResult


          
          
            GO
          
          
            CREATE
          
          
            PROC
          
          
             sp_SplitResult


          
          
            AS
          
          
            BEGIN
          
          
            --
          
          
            声明一个表
          
          
            SET
          
             NOCOUNT 
          
            ON
          
          
            DECLARE
          
          
            @tb
          
          
            TABLE
          
          
            

            (

              name 
          
          
            VARCHAR
          
          (
          
            20
          
          
            ) ,

              score 
          
          
            VARCHAR
          
          (
          
            10
          
          
            )

            )

        
          
          
            DECLARE
          
          
            @name
          
          
            VARCHAR
          
          (
          
            20
          
          )
          
            =
          
          
            ''
          
          
             ,

            
          
          
            @SourceObject
          
          
            VARCHAR
          
          (
          
            MAX
          
          
            )

        

        
          
          
            --
          
          
            创建游标
          
          
            DECLARE
          
           cursor_tb 
          
            CURSOR
          
          
             FAST_FORWARD

        
          
          
            FOR
          
          
            

            ( 
          
          
            SELECT
          
          
                fName ,

                        Scroe

              
          
          
            FROM
          
          
                  dbo.Test1

              
          
          
            WHERE
          
               Scroe 
          
            <>
          
          
            ''
          
          
            

            )

        
          
          
            OPEN
          
          
              cursor_tb

        
          
          
            FETCH
          
          
            NEXT
          
          
            FROM
          
          
             cursor_tb

        
          
          
            INTO
          
          
            @name
          
          , 
          
            @SourceObject
          
          
            ;

        

        
          
          
            WHILE
          
          
            @@FETCH_STATUS
          
          
            =
          
          
            0
          
          
            BEGIN
          
          
            INSERT
          
          
            @tb
          
          
            SELECT
          
          
            @name
          
          
             ,

                                score

                        
          
          
            FROM
          
              dbo.getSplitResult(
          
            @SourceObject
          
          , 
          
            '
          
          
            ,
          
          
            '
          
          
            ) 

                
          
          
            FETCH
          
          
            NEXT
          
          
            FROM
          
          
             cursor_tb

        
          
          
            INTO
          
          
            @name
          
          , 
          
            @SourceObject
          
          
            END
          
          
            CLOSE
          
          
             cursor_tb

        
          
          
            DEALLOCATE
          
          
             cursor_tb

        

      

      

        
          
          
            SELECT
          
          
            DISTINCT
          
          
            *
          
          
            FROM
          
          
            @tb
          
          
            END
          
          
            --
          
          
              EXEC sp_SplitResult 
          
        
View Code

--执行结果

        
          EXEC
        
         sp_SplitResult 
      

 

      



SQL脚本整理系列一 分隔函数


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论