Ver Mensaje Individual
  #6 (permalink)  
Antiguo 26/02/2010, 03:42
Avatar de Beakdan
Beakdan
 
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Respuesta: apoyo con query

No has puesto más detalles de la estructura de la tabla de donde tomas los datos, así que he tenido que improvisar para tener una estructura para probar. Como te había comentado, me parece que una solución con una tabla auxiliar de números sería más adecuada en términos de performance. Sobre la misma línea de performance, trata de evitar cursores o bucles while.
Ya que estás usando SQL Server 2005, puedes usar funciones XML, te pongo un ejemplo:

Código:
DECLARE @t AS TABLE(
 Id  INT NOT NULL,
 Campo1 VARCHAR(1000)
);
INSERT INTO @t
SELECT 1, 'JUAN|MANUEL|TREJO|GOMEZ|1|MARA|ESCARLET|DE LA MORA|LUNA|1' UNION ALL
SELECT 2, 'FERNANDO||CERVANTES|FIGUEROA|5' UNION ALL
SELECT 3, 'BENITO||PEREZ|GALDOS|3|PEDRO|ANTONIO|DE ALARCÓN||4';
WITH pre AS (
 SELECT Id, CAST('<x>' + REPLACE(Campo1, '|', '</x><x>')+ '</x>' AS XML) AS Campo1
 FROM @t
)
SELECT Id, [0] AS C1, [1] AS C2, [2] AS C3, [3] AS C4, [4] AS C5
FROM (
   SELECT  Id,
      (x.rn - 1) / 5 AS Row,
      (x.rn - 1) % 5 AS Col,
      x.c
   FROM  pre
      CROSS APPLY (
       SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) as rn,
         x.c.value('.', 'VARCHAR(30)') AS c
       FROM pre.Campo1.nodes('/x') AS x(c)
      ) AS x
  ) AS DAT
PIVOT (MAX(c) FOR Col IN([0], [1], [2], [3], [4])) AS pvt
ORDER BY Id
OPTION (MAXDOP 1);
Sugiero que te documentes sobre como resolver (y como no resolver) esta clase de problemas buscando palabras clave como RBAR, Set-Based logic, resolviendo algunos puzzles de SQL como los que tiene Joe Celko en su libro SQL for Smarties, o los problemas del sitio Beyond Relational.