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)
--创建分隔函数
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
--创建存储过程
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
--执行结果
EXEC sp_SplitResult
顶
收藏
关注
评论
作者:王思明
出处:http://www.cnblogs.com/maanshancss/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。所有源码遵循Apache协议,使用必须添加 from maanshancss
出处:http://www.cnblogs.com/maanshancss/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。所有源码遵循Apache协议,使用必须添加 from maanshancss