TSQL UDF每8个字符拆分字符串

时间:2011-05-21 01:51:45

标签: sql-server tsql user-defined-functions

有人决定将多次拼凑成一个列,因此列值可能如下所示:

08:00 AM01:00 PM

另一列包含以下格式的日期;

20070906

我想编写一个UDF来在单个SQL查询中规范化这个数据,所以我可以为上面的例子找回2行日期时间类型

2007-09-06 08:00:00.000
2007-09-06 13:00:00.000

转换为datetime类型很简单......但我需要每8个字符拆分时间部分以获得个人超时。

有人知道现有的UDF要做到这一点吗?

2 个答案:

答案 0 :(得分:8)

试试这个,它会将你的字符串分成指定长度的块:

create function SplitString
(   
    @str varchar(max),
    @length int
)
returns @Results table( Result varchar(50) ) 
AS
begin
    declare @s varchar(50)
    while len(@str) > 0
    begin
        set @s = left(@str, @length)
        set @str = right(@str, len(@str) - @length)
        insert @Results values (@s)
    end
    return 
end

例如:

select * from dbo.SplitString('08:00 AM01:00 PM', 8)

会给出这个结果:

<强>结果

08:00 AM

01:00 PM

答案 1 :(得分:2)

上面的查询中存在错误,以下查询修复此错误。 此外,我已使返回的表包含序列列,以便可以确定拆分的顺序:

CREATE function SplitString
(   
    @str varchar(max),
    @length int
)
RETURNS @Results TABLE( Result varchar(50),Sequence INT ) 
AS
BEGIN

DECLARE @Sequence INT 
SET @Sequence = 1

    DECLARE @s varchar(50)
    WHILE len(@str) > 0
    BEGIN
        SET @s = left(@str, @length)
        INSERT @Results VALUES (@s,@Sequence)

        IF(len(@str)<@length)
        BREAK

        SET @str = right(@str, len(@str) - @length)
        SET @Sequence = @Sequence + 1
    END
    RETURN 
END