zoukankan      html  css  js  c++  java
  • SQL脚本整理系列一 分隔函数

    原来效果:

    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 




  • 相关阅读:
    Spring MVC Ajax 嵌套表单数据的提交
    Spring MVC 过滤静态资源访问
    Spring MVC 页面跳转时传递参数
    IDEA Maven 三层架构 2、运行 springMVC
    IDEA Maven 三层架构 1、基本的Archetype 搭建
    EasyUI DataGrid 基于 Ajax 自定义取值(loadData)
    Spring MVC Ajax 复杂参数的批量传递
    Mybatis Sql片段的应用
    在 Tomcat 8 部署多端口项目
    自动升级的设计思路与实现
  • 原文地址:https://www.cnblogs.com/maanshancss/p/4398436.html
Copyright © 2011-2022 走看看