Skip Navigation Links
技术文档
·网站建设
·软件使用
·图形设计
·程序开发
·网络应用
·电脑技巧
 
公司介绍
·公司简介
·索仕SRCOS网络应用平台
·索仕网站管理系统
·影视广告制作
·联系我们
 
 

SQL Server中几种特殊的“字符串到列表”的处理函数

6/17/2008 12:05:12 AM
普通的字符串分割函数已经见得很多了,写法性能也大不一样,通常都是直接基于字符串的处理,这里就不列出了。下面介绍几种特殊的方式

1.使用xml
     性能应该不如字符串处理快,没有具体测试过
SQL Server中几种特殊的“字符串到列表”的处理函数IF OBJECT_ID('dbo.Split') IS NOT NULL
SQL Server中几种特殊的“字符串到列表”的处理函数   
DROP FUNCTION dbo.Split
SQL Server中几种特殊的“字符串到列表”的处理函数
SQL Server中几种特殊的“字符串到列表”的处理函数
GO
SQL Server中几种特殊的“字符串到列表”的处理函数
CREATE FUNCTION dbo.Split(@data NVARCHAR(MAX), @delimiter NVARCHAR(5))
SQL Server中几种特殊的“字符串到列表”的处理函数
RETURNS @t TABLE (data NVARCHAR(max))
SQL Server中几种特殊的“字符串到列表”的处理函数
AS
SQL Server中几种特殊的“字符串到列表”的处理函数
BEGIN
SQL Server中几种特殊的“字符串到列表”的处理函数   
SQL Server中几种特殊的“字符串到列表”的处理函数   
DECLARE @textXML XML;
SQL Server中几种特殊的“字符串到列表”的处理函数   
SELECT    @textXML = CAST('<d>' + REPLACE(@data, @delimiter, '</d><d>') + '</d>' AS XML);
SQL Server中几种特殊的“字符串到列表”的处理函数
SQL Server中几种特殊的“字符串到列表”的处理函数   
INSERT INTO @t(data)
SQL Server中几种特殊的“字符串到列表”的处理函数   
SELECT  T.split.value('.', 'nvarchar(max)') AS data
SQL Server中几种特殊的“字符串到列表”的处理函数   
FROM    @textXML.nodes('/d') T(split)
SQL Server中几种特殊的“字符串到列表”的处理函数   
SQL Server中几种特殊的“字符串到列表”的处理函数   
RETURN
SQL Server中几种特殊的“字符串到列表”的处理函数
END
SQL Server中几种特殊的“字符串到列表”的处理函数
GO
SQL Server中几种特殊的“字符串到列表”的处理函数
SQL Server中几种特殊的“字符串到列表”的处理函数
DECLARE @text NVARCHAR(max)
SQL Server中几种特殊的“字符串到列表”的处理函数
SELECT @text = REPLICATE('ab,', 300) + 'ab'
SQL Server中几种特殊的“字符串到列表”的处理函数
SQL Server中几种特殊的“字符串到列表”的处理函数
SELECT * FROM dbo.Split(@text, ',')
SQL Server中几种特殊的“字符串到列表”的处理函数

2. 用xml作为参数
 

/*    Assumes XML is as such
SQL Server中几种特殊的“字符串到列表”的处理函数    <list>
SQL Server中几种特殊的“字符串到列表”的处理函数        <i>1</i>
SQL Server中几种特殊的“字符串到列表”的处理函数        <i>23</i>
SQL Server中几种特殊的“字符串到列表”的处理函数    </list>
SQL Server中几种特殊的“字符串到列表”的处理函数    etcSQL Server中几种特殊的“字符串到列表”的处理函数
SQL Server中几种特殊的“字符串到列表”的处理函数
SQL Server中几种特殊的“字符串到列表”的处理函数    Uses minimal xml markup to keep input size as small as possible
SQL Server中几种特殊的“字符串到列表”的处理函数
*/

SQL Server中几种特殊的“字符串到列表”的处理函数
ALTER FUNCTION dbo.fnXml2IntList(@xmlList xml)
SQL Server中几种特殊的“字符串到列表”的处理函数
RETURNS TABLE 
SQL Server中几种特殊的“字符串到列表”的处理函数
AS 
SQL Server中几种特殊的“字符串到列表”的处理函数   
RETURN (SELECT tList.ListValue.value('.', 'int') AS ListValue
SQL Server中几种特殊的“字符串到列表”的处理函数           
FROM @xmlList.nodes('list/i') AS tList(ListValue))
SQL Server中几种特殊的“字符串到列表”的处理函数
GO 

使用示例:
SQL Server中几种特殊的“字符串到列表”的处理函数SELECT * FROM dbo.fnXml2IntList 
SQL Server中几种特殊的“字符串到列表”的处理函数
'<list>
SQL Server中几种特殊的“字符串到列表”的处理函数        <i>1</i>
SQL Server中几种特殊的“字符串到列表”的处理函数        <i>23</i>
SQL Server中几种特殊的“字符串到列表”的处理函数   </list>
' 
SQL Server中几种特殊的“字符串到列表”的处理函数


3.利用笛卡尔集的方式
SQL Server中几种特殊的“字符串到列表”的处理函数-- =============================================
SQL Server中几种特殊的“字符串到列表”的处理函数--
Author:        代码乱了(靳如坦)
SQL Server中几种特殊的“字符串到列表”的处理函数--
Create date: 2008-06-10
SQL Server中几种特殊的“字符串到列表”的处理函数--
Description:    把以','分隔的字符串,转换成table
SQL Server中几种特殊的“字符串到列表”的处理函数--
示例 :select * from [dbo].[SpliteStringToList]('123,xxx,dfdsf,rer')
SQL Server中几种特殊的“字符串到列表”的处理函数--
=============================================
SQL Server中几种特殊的“字符串到列表”的处理函数
create Function [dbo].[SpliteStringToList](@strings varchar(2000))  
SQL Server中几种特殊的“字符串到列表”的处理函数
Returns @ReturnTable Table(ID varchar(max))  
SQL Server中几种特殊的“字符串到列表”的处理函数
As  
SQL Server中几种特殊的“字符串到列表”的处理函数
Begin
SQL Server中几种特殊的“字符串到列表”的处理函数   
Insert @ReturnTable
SQL Server中几种特殊的“字符串到列表”的处理函数   
select substring(c,2,charindex(',',c,2)-2) as empno   from 
SQL Server中几种特殊的“字符串到列表”的处理函数    (
SQL Server中几种特殊的“字符串到列表”的处理函数       
select substring(csv.emps,iter.pos,len(csv.emps)) as c from 
SQL Server中几种特殊的“字符串到列表”的处理函数        (
SQL Server中几种特殊的“字符串到列表”的处理函数           
select ','+@strings+',' as emps
SQL Server中几种特殊的“字符串到列表”的处理函数        ) csv,
SQL Server中几种特殊的“字符串到列表”的处理函数        (
SQL Server中几种特殊的“字符串到列表”的处理函数           
--select id as pos from t100
SQL Server中几种特殊的“字符串到列表”的处理函数
            --生产1-10000的结果集
SQL Server中几种特殊的“字符串到列表”的处理函数
            Select  a + b * 10 +c*100+d*1000+1 as pos From
SQL Server中几种特殊的“字符串到列表”的处理函数            (
Select 0 As a Union Select 1 Union Select 2 Union Select 3 Union Select 4 Union Select 5 Union Select 6 Union  Select 7 Union Select 8 Union Select 9 ) A,
SQL Server中几种特殊的“字符串到列表”的处理函数            (
Select 0 As b Union Select 1 Union Select 2 Union Select 3 Union Select 4 Union Select 5 Union Select 6 Union  Select 7 Union Select 8 Union Select 9 ) B,
SQL Server中几种特殊的“字符串到列表”的处理函数            (
Select 0 As c Union Select 1 Union Select 2 Union Select 3 Union Select 4 Union Select 5 Union Select 6 Union  Select 7 Union Select 8 Union Select 9 ) c,
SQL Server中几种特殊的“字符串到列表”的处理函数            (
Select 0 As d Union Select 1 Union Select 2 Union Select 3 Union Select 4 Union Select 5 Union Select 6 Union  Select 7 Union Select 8 Union Select 9 ) d
SQL Server中几种特殊的“字符串到列表”的处理函数        ) iter
where iter.pos <= len(csv.emps)
SQL Server中几种特殊的“字符串到列表”的处理函数    )x
SQL Server中几种特殊的“字符串到列表”的处理函数   
where len(c) > 1 and substring(c,1,1) = ','
SQL Server中几种特殊的“字符串到列表”的处理函数   
Return
SQL Server中几种特殊的“字符串到列表”的处理函数
End
SQL Server中几种特殊的“字符串到列表”的处理函数 
该函数主要运用了笛卡尔集的特点,速度上稍微慢于普通字符串处理,不过比较稳定,没有循环处理,结构上比较清晰。
需要注意到是,这个函数只能处理数组大小为10000的字符串,如果想处理更多。建议把上面的产生1-10000的结果集再扩大,并放在一个表内,这样性能肯定会有所提高,我这儿只是为了方便直接用内嵌视图,实际应用中应该先生成1-10000(根据实际应用可大可小)的数据表。如果大家发现什么问题,欢迎指正,谢谢。
 
4.运用WITH AS,递归
待续。。。。
作者:代码乱了 来源:博客园
 
 
 
昆明索仕科技开发有限公司 版权所有 Copyright© 2002-2010 Kunming Source Technology Exploitive Co.,LTD. All Rights Reserved.
电话:0871-5627877 业务QQ:163871 联系我们
本站基于:索仕网站信息管理系统建设 版本 2.0.4325