2011-06-16 15 views
7

Hola tengo una entrada comodividir una cadena en caracteres individuales en SQL Server 2005

ID data 
1 hello 
2 sql 

siendo la salida deseada

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 

Mi enfoque en lo que va siendo

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 

El consulta no funciona en absoluto con una excepción que es

Msg 512, nivel 16, estado 1, línea 4
Subconsulta devolvió más de 1 valor. Esto no está permitido cuando la subconsulta sigue =,! =, <, < =,>,> = o cuando la subconsulta se usa como una expresión .

Editar:

he encontrado mi respuesta

;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 

Ayuda necesaria

Respuesta

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

De hecho, me respondidos a mi propia pregunta en la parte de edición mencionado en teh cuerpo cuestionado desde que estoy teniendo menos de puntos de reputación. Pero gracias por la respuesta y aceptaré la tuya, pero la mía también está funcionando bien. Lo solicito, ya que tiene más reputación, ¿es posible que saque mi respuesta y pegue la respuesta? Si es así, haga lo necesario si siente que mi respuesta es tan correcta como la suya. – aditi

+0

@aditi - Debería poder responder sus propias preguntas. Puede haber un límite de tiempo (¿8 horas?) Para usuarios con un representante menor de 100. No puedo encontrarlo en las preguntas frecuentes pero recuerdo haber leído sobre eso. Puedes ** aceptar ** tu propia respuesta después de 48 horas. –

0

Mensaje viejo pero vale la pena publicar una solución puramente basada en el set. El uso de NGrams8K se puede hacer esto:

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); 

Devuelve:

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 
Cuestiones relacionadas