split 函数

 

CREATE FUNCTION fntest ( @list VARCHAR(MAX) )
RETURNS @t TABLE ( SecId VARCHAR(10) )
AS
BEGIN

;
WITH cte
AS ( SELECT SUBSTRING(@list, LEN(@list) - 10 + 1, 10) AS v
,1 lvl
UNION ALL
SELECT SUBSTRING(@list,
LEN(@list) - 10 * ( lvl + 1 ) + 1,
10) AS v
,lvl + 1
FROM cte
WHERE LEN(@list) - 10 * ( lvl + 1 ) + 1 > 0
)
INSERT INTO @t
SELECT v
FROM cte
OPTION ( MAXRECURSION 0 )

RETURN
END


Go

 

CREATE FUNCTION dbo.fntest (@list VARCHAR(MAX))
RETURNS @result TABLE (Id CHAR(10)) AS

BEGIN
DECLARE @currentPosition int
DECLARE @tempString varchar(MAX)
DECLARE @remaining int
DECLARE @tempValue varchar(MAX)

SET @currentPosition = 1
SET @remaining = ''
WHILE @currentPosition <= datalength(@list)
BEGIN
SET @tempString = substring(@list, @currentPosition, 8000)
SET @currentPosition = @currentPosition + 8000

SET @remaining = len(@tempString)

WHILE @remaining > 0
BEGIN
SET @tempValue = left(@tempString, 10)
INSERT @result (Id) VALUES(LTRIM(@tempValue))

SET @tempString = substring(@tempString, 11, len(@tempString))
SET @remaining = @remaining - 10
END
END
RETURN
END
GO

 

 

-- table creation

USE db1
go

CREATE TABLE Numbers ( n INT NOT NULL )
ALTER TABLE Numbers ADD CONSTRAINT pk_Numbers PRIMARY KEY CLUSTERED (n)


DECLARE @i INT
SET @i = 0

WHILE @i <= 8000
BEGIN
INSERT Numbers
SELECT @i
SET @i = @i + 1
END


-- create function
CREATE FUNCTION dbo.fntest ( @list VARCHAR(MAX) )
RETURNS TABLE
AS
RETURN
( SELECT Id = SUBSTRING(l.v n * 10 + 1 10)
FROM ( SELECT @list v
) l
INNER JOIN db1..Numbers n ON n <= LEN(l.v) / 10
WHERE LEN(SUBSTRING(l.v n * 10 + 1 10)) > 0
)
Go

 

 

根据性能测试,第三种方法是最优化的。


 

 

posted on 2012-03-28 11:06  Henry.Lau 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/Henry1225/archive/2012/03/28/2420878.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值