网站建设中怎么写,4366网页游戏,专业网站建设设计,拼多多关键词排名查询软件【SQL】sql版Split函数。用于拆分字符串为单列表格 功能与.net版string.Split函数类似#xff0c;只不过.net返回的是数组#xff0c;这个返回的是一个单列表格#xff0c;每个拆分出来的子串占一行。可选是否移除空格子串和重复项。市面上类似的函数不算少#xff0c;但大… 【SQL】sql版Split函数。用于拆分字符串为单列表格 功能与.net版string.Split函数类似只不过.net返回的是数组这个返回的是一个单列表格每个拆分出来的子串占一行。可选是否移除空格子串和重复项。市面上类似的函数不算少但大多都是在循环中对原串进行改动我感觉这样不好虽然不知道sql的字符串是不是像.net的一样具有不可变性但感觉尽量不要去动原串最好万一sql的字串也不可变那变一次就要产生一份尤其是每圈循环都在变内存消耗让人心疼所以才有重新造个轮子的想法。 另外如果SQL开启了CLR支持完全可以封装一个.net的Split到SQL里用这样最简单性能也应该更好猜测。不废话上函数 /*-------------------------------
函数拆分字符串到单列表格v0.02
Author:AhDung
Update:201403251158
-------------------------------*/
ALTER FUNCTION dbo.Split(
s VARCHAR(8000), --要拆分的字符串
separator NVARCHAR(10), --分隔符。最长支持10个字符的分隔符
removeEmpty BIT, --是否移除空格项目。不处理制表符、回车换行
unique BIT --是否移除重复项
)
RETURNS t TABLE (S VARCHAR(500)) AS
BEGINIF s IS NULL RETURNIF CHARINDEX(separator,s)0BEGIN INSERT t VALUES(LEFT(s,250)) RETURN ENDSET s separator --仅对原串做一次改动。其实一次不改也行但需要在循环中加判断。这样是为了在CPU和内存消耗之间取平衡DECLARE lenS INT LEN(s),lenSptr INT DATALENGTH(separator)/2,i INT0,tmp NVARCHAR(250),nextSptrIndex INTWHILE i lenSBEGINSET nextSptrIndexCHARINDEX(separator,s,i1)SET tmpSUBSTRING(s,i1,nextSptrIndex-1-i)INSERT INTO t VALUES(tmp)SET iDATALENGTH(tmp)/2lenSptrENDIF removeEmpty1BEGINDELETE t WHERE SENDIF unique1BEGINWITH cteA AS (SELECT ROW_NUMBER() OVER(PARTITION BY S ORDER BY S) AS ID FROM t)DELETE cteA WHERE ID1ENDRETURN
END 文毕 posted on 2014-03-25 11:53 ahdung 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/ahdung/p/3622808.html