2011-05-21 82 views
4

有人决定一起的东西一堆倍到单个列,因此该列的值可能是这样的:TSQL UDF来分割字符串中的每个8个字符

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做到这一点?

谢谢。

+1

这有什么错用SUBSTRING? http://msdn.microsoft.com/en-us/library/ms187748.aspx – 2011-05-21 02:09:37

+0

每个8个字符,不只是8个字符。 SUBSTRING生成一个字符串。 – Jeff 2011-05-21 12:40:20

+0

我很清楚这一点。建议你多次调用它......就像循环中一样! – 2011-05-21 12:48:27

回答

7

试试这个,它会将您的字符串分割成指定的宽度对大块:

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

+0

太棒了,谢谢! – Jeff 2011-05-21 12:41:11

+0

你会如何建议我将它加入到源表中? – Jeff 2011-05-21 12:49:28

+0

大错误。尝试设置长度大于4,并看到这是无限计算和无法得到结果。我检查了它,并检查下面@Rhyno的方式,发现他的解决方案工作正常。 – QMaster 2014-10-20 08:58:40

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 
+0

+1棒极了的人。我尝试了一些解决方案,但其中一些解决方案无法在大长度或小长度上工作或性能不佳。你纠正了接受的答案,你的方式正在工作。这是另一个解决方案得到了接受但无用的解决方案。 http://stackoverflow.com/questions/10852612/split-string-in-sql-server-to-a-maximum-length-returning-each-as-a-row我想写一个答案为基础的你的如果你不介意的话。再次感谢。 – QMaster 2014-10-20 09:01:59