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 

 





你可能感兴趣的:(sql)