一、字符串的分拆处理函数
1-- 循环截取法@H_403_9@ CREATE FUNCTION f_splitSTR(@H_403_9@ @s varchar(8000), --待分拆的字符串@H_403_9@ @split varchar(10) --数据分隔符@H_403_9@ )RETURNS @re table(col varchar(100))@H_403_9@ AS@H_403_9@ BEGIN@H_403_9@ DECLARE @splitlen int@H_403_9@ SET @splitlen=LEN(@split+'a')-2@H_403_9@ WHILE CHARINDEX(@split,@s)>0@H_403_9@ BEGIN@H_403_9@ INSERT @re VALUES(left(@s,CHARINDEX(@split,@s)-1))@H_403_9@ SET @s=STUFF(@s,1,@s)+@splitlen,'')@H_403_9@ END@H_403_9@ INSERT @re VALUES(@s)@H_403_9@ RETURN@H_403_9@ END@H_403_9@ GO@H_403_9@
2--使用临时性分拆辅助表法@H_403_9@ CREATE FUNCTION f_splitSTR(@H_403_9@ @s varchar(8000), --待分拆的字符串@H_403_9@ @split varchar(10) --数据分隔符@H_403_9@ )RETURNS @re table(col varchar(100))@H_403_9@ AS@H_403_9@ BEGIN@H_403_9@ --创建分拆处理的辅助表(用户定义函数中只能 *** 作表变量)@H_403_9@ DECLARE @t table(ID int IDENTITY,b bit)@H_403_9@ INSERT @t(b) SELECT top 8000 0 FROM syscolumns a,syscolumns b
INSERT @re SELECT SUBSTRING(@s,ID,@s+@split,ID)-ID)@H_403_9@ FROM @t@H_403_9@ WHERE ID<=LEN(@s+'a') @H_403_9@ AND CHARINDEX(@split,@split+@s,ID)=ID@H_403_9@ RETURN@H_403_9@ END@H_403_9@ GO
3-- 使用永久性分拆辅助表法@H_403_9@ --字符串分拆辅助表@H_403_9@ SELECT top 8000 ID=IDENTITY(int,1) INTO dbo.tb_splitSTR@H_403_9@ FROM syscolumns a,syscolumns b@H_403_9@ GO
--字符串分拆处理函数@H_403_9@ CREATE FUNCTION f_splitSTR(@H_403_9@ @s varchar(8000), --待分拆的字符串@H_403_9@ @split varchar(10) --数据分隔符@H_403_9@ )RETURNS table@H_403_9@ AS@H_403_9@ RETURN(@H_403_9@ SELECT col=CAST(SUBSTRING(@s,ID)-ID) as varchar(100))@H_403_9@ FROM tb_splitSTR@H_403_9@ WHERE ID<=LEN(@s+'a') @H_403_9@ AND CHARINDEX(@split,ID)=ID)@H_403_9@ GO
4--将数据项按数字与非数字再次拆份@H_403_9@ CREATE FUNCTION f_splitSTR(@H_403_9@ @s varchar(8000), --待分拆的字符串@H_403_9@ @split varchar(10) --数据分隔符@H_403_9@ )RETURNS @re table(No varchar(100),Value varchar(20))@H_403_9@ AS@H_403_9@ BEGIN@H_403_9@ --创建分拆处理的辅助表(用户定义函数中只能 *** 作表变量)@H_403_9@ DECLARE @t table(ID int IDENTITY,syscolumns b
INSERT @re @H_403_9@ SELECT No=REVERSE(STUFF(col,PATINDEX('%[^-^.^0-9]%',col+'a')-1,'')),@H_403_9@ Value=REVERSE(left(col,col+'a')-1))@H_403_9@ FROM(@H_403_9@ SELECT col=REVERSE(SUBSTRING(@s,ID)-ID))@H_403_9@ FROM @t@H_403_9@ WHERE ID<=LEN(@s+'a') @H_403_9@ AND CHARINDEX(@split,ID)=ID)a@H_403_9@ RETURN@H_403_9@ END@H_403_9@ GO
二、字符串的合并
1--使用游标法进行字符串合并处理的示例。@H_403_9@ --处理的数据@H_403_9@ CREATE table tb(col1 varchar(10),col2 int)@H_403_9@ INSERT tb SELECT 'a',1@H_403_9@ UNION ALL SELECT 'a',2@H_403_9@ UNION ALL SELECT 'b',1@H_403_9@ UNION ALL SELECT 'b',3
--合并处理@H_403_9@ --定义结果集表变量@H_403_9@ DECLARE @t table(col1 varchar(10),col2 varchar(100))
--定义游标并进行合并处理@H_403_9@ DECLARE tb CURSOR LOCAL@H_403_9@ FOR@H_403_9@ SELECT col1,col2 FROM tb ORDER BY col1,col2@H_403_9@ DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100)@H_403_9@ OPEN tb@H_403_9@ FETCH tb INTO @col1,@col2@H_403_9@ SELECT @col1_old=@col1,@s=''@H_403_9@ WHILE @@FETCH_STATUS=0@H_403_9@ BEGIN@H_403_9@ IF @col1=@col1_old@H_403_9@ SELECT @s=@s+','+CAST(@col2 as varchar)@H_403_9@ ELSE@H_403_9@ BEGIN@H_403_9@ INSERT @t VALUES(@col1_old,STUFF(@s,''))@H_403_9@ SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1@H_403_9@ END@H_403_9@ FETCH tb INTO @col1,@col2@H_403_9@ END@H_403_9@ INSERT @t VALUES(@col1_old,''))@H_403_9@ CLOSE tb@H_403_9@ DEALLOCATE tb@H_403_9@ --显示结果并删除测试数据@H_403_9@ SELECT * FROM @t@H_403_9@ DROP table tb@H_403_9@ /*--结果@H_403_9@ col1 col2@H_403_9@ ---------- -----------@H_403_9@ a 1,2@H_403_9@ b 1,2,3@H_403_9@ --*/@H_403_9@ GO
2--使用用户定义函数,配合SELECT处理完成字符串合并处理的示例@H_403_9@ --处理的数据@H_403_9@ CREATE table tb(col1 varchar(10),3@H_403_9@ GO
--合并处理函数@H_403_9@ CREATE FUNCTION dbo.f_str(@col1 varchar(10))@H_403_9@ RETURNS varchar(100)@H_403_9@ AS@H_403_9@ BEGIN@H_403_9@ DECLARE @re varchar(100)@H_403_9@ SET @re=''@H_403_9@ SELECT @re=@re+','+CAST(col2 as varchar)@H_403_9@ FROM tb@H_403_9@ WHERE col1=@col1@H_403_9@ RETURN(STUFF(@re,''))@H_403_9@ END@H_403_9@ GO
--调用函数@H_403_9@ SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1@H_403_9@ --删除测试@H_403_9@ DROP table tb@H_403_9@ DROP FUNCTION f_str@H_403_9@ /*--结果@H_403_9@ col1 col2@H_403_9@ ---------- -----------@H_403_9@ a 1,3@H_403_9@ --*/@H_403_9@ GO
3-- 使用临时表实现字符串合并处理的示例@H_403_9@ --处理的数据@H_403_9@ CREATE table tb(col1 varchar(10),3
--合并处理@H_403_9@ SELECT col1,col2=CAST(col2 as varchar(100)) @H_403_9@ INTO #t FROM tb@H_403_9@ ORDER BY col1,col2@H_403_9@ DECLARE @col1 varchar(10),@col2 varchar(100)@H_403_9@ UPDATE #t SET @H_403_9@ @col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,@H_403_9@ @col1=col1,@H_403_9@ col2=@col2 SELECT * FROM #t /*--更新处理后的临时表 col1 col2 ---------- ------------- a 1 a 1,2 b 1 b 1,2 b 1,3 --*/ --得到最终结果 SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1 /*--结果 col1 col2 ---------- ----------- a 1,3 --*/ --删除测试 DROP table tb,#t GO
总结以上是内存溢出为你收集整理的SqlServer教程—第三章(字符处理一)全部内容,希望文章能够帮你解决SqlServer教程—第三章(字符处理一)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)