2011-06-16 77 views
7

嗨单个字符我有一个​​输入为分割字符串转换成SQL Server 2005中

ID data 
1 hello 
2 sql 

所需的输出是

ID RowID Chars 
1 1  H 
1 2  e 
1 3  l 
1 4  l 
1 5  o 
2 1  s 
2 2  q 
2 3  l 

我的做法至今被

Declare @t table(ID INT IDENTITY , data varchar(max)) 
Insert into @t Select 'hello' union all select 'sql' 
--Select * from @t 
;With CteMaxlen As(
Select MaxLength = max(len(data)) from @t) 
, Num_Cte AS 
(  
     SELECT 1 AS rn 
     UNION ALL 
     SELECT rn +1 AS rn 
     FROM Num_Cte 
     WHERE rn <(select MaxLength from CteMaxlen) 
) 
-- Shred into individual characters 
, Get_Individual_Chars_Cte AS 
( 
     SELECT 
      ID 
      ,Row_ID =ROW_NUMBER() Over(PARTITION by ID Order by ID) 
      ,chars    
     FROM @t,Num_Cte 
     CROSS APPLY(SELECT SUBSTRING((select data from @t),rn,1) AS chars) SplittedChars  
) 

Select * from Get_Individual_Chars_Cte 

的查询根本不起作用,例外是

Msg 512,Level 16,State 1,Line 4
子查询返回多个值。 当 子查询遵循=,!=,<,< =,>,> = 或当子查询用作 表达式时,这是不允许的。

编辑:

我发现我的答案

;with Get_Individual_Chars_Cte AS 
( 
    SELECT 
     ID, 
     Row_ID =ROW_NUMBER() Over(PARTITION by ID Order by ID) 
     ,SUBSTRING(Data,Number,1) AS [Char]--, 

FROM @t 
INNER JOIN master.dbo.spt_values ON 
Number BETWEEN 1 AND LEN(Data) 
AND type='P' 

) 

Select * from Get_Individual_Chars_Cte 

帮助需要

回答

2
;with cte as 
(
    select ID, 
     substring(data, 1, 1) as Chars, 
     stuff(data, 1, 1, '') as data, 
     1 as RowID 
    from @t 
    union all 
    select ID, 
     substring(data, 1, 1) as Chars, 
     stuff(data, 1, 1, '') as data, 
     RowID + 1 as RowID 
    from cte 
    where len(data) > 0 
) 
select ID, RowID, Chars 
from cte 
order by ID, RowID 
+0

其实我answerd我自己的问题,因为在我有少点声望值,在格兰质疑体中提到的编辑部分。但谢谢你的答案,我会接受你的,但我的工作也很好。我请求,因为你有更多的声誉,你有可能拿出我的答案并粘贴答案部分?如果是这样,如果您觉得我的回答与您的回答一样正确,请做好必要的工作。 – aditi 2011-06-16 05:53:59

+0

@aditi - 你应该能够回答你自己的问题。代表100以下的用户可能会有一个时间限制(8小时?)。在常见问题解答中找不到它,但我记得阅读过这些内容。 48小时后,您可以**接受**自己的答案。 – 2011-06-16 06:15:06

0

老的文章,但它是值得发布一个纯粹的基于集的解决方案。使用NGrams8K你可以这样做:

Declare @t table(ID INT IDENTITY , data varchar(max)) 
Insert into @t Select 'hello' union all select 'sql'; 

SELECT ID, Row_ID = position, [char] = token 
FROM @t 
CROSS APPLY dbo.NGrams8k(data,1); 

返回:

ID Row_ID char 
--- ------- -------- 
1 1  h 
1 2  e 
1 3  l 
1 4  l 
1 5  o 
2 1  s 
2 2  q 
2 3  l