2010-11-24 8 views
6

estoy escribiendo un cursor para rellenar los datos en la nueva tabla de la mesa principal, que contiene datos en forma de abajo¿Cómo dividir cadena y guardar en una matriz en T-SQL

artículo     Colores
camisa     rojo, azul, verde, amarillo

Quiero poblar los nuevos datos de la tabla por ir a buscar el punto y luego agregarla en la fila, de acuerdo con cada color que contiene

artículo     color
camisa     Rojo
camisa     azul
camisa     verde
camisa     amarillo

estoy atascado en la forma de

1) Delimate/Dividir Cadena de "colores" 2) Para guardarlo en una matriz 3) Para usarlo en el cursor

, ya que voy a utilizar el cursor anidado para este fin.

Respuesta

4

Utilizar servidor SQL 2005+ y el tipo de datos XML, puede echar un vistazo a la siguiente

DECLARE @Table TABLE(
     Item VARCHAR(250), 
     Colors VARCHAR(250) 
) 

INSERT INTO @Table SELECT 'Shirt','Red,Blue,Green,Yellow' 
INSERT INTO @Table SELECT 'Pants','Black,White' 


;WITH Vals AS (
     SELECT Item, 
       CAST('<d>' + REPLACE(Colors, ',', '</d><d>') + '</d>' AS XML) XmlColumn 
     FROM @Table 
) 
SELECT Vals.Item, 
     C.value('.','varchar(max)') ColumnValue 
FROM Vals 
CROSS APPLY Vals.XmlColumn.nodes('/d') AS T(C) 
2

El artículo Faking Arrays in Transact SQL detalles varias técnicas para resolver este problema, que van desde el uso de la función ParseName() (límite a 5 elementos) para escribir funciones CLR.

La respuesta XML es una de las técnicas detalladas que se pueden elegir a un escenario específico.

Combinando algunos de los consejos, he resuelto mi problema de cadena de dividir así:

SET NOCOUNT ON; 

DECLARE @p NVARCHAR(1000), @len INT; 
SET @p = N'value 1,value 2,value 3,value 4,etc'; 
SET @p = ',' + @p + ','; 
SET @len = LEN(@p); 

-- Remove this table variable creation if you have a permanent enumeration table 
DECLARE @nums TABLE (n int); 
INSERT INTO @nums (n) 
    SELECT A.n FROM 
    (SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY TableKey) as n FROM dbo.Table) A 
    WHERE A.n BETWEEN 1 AND @len; 

SELECT SUBSTRING(@p , n + 1, CHARINDEX(',', @p, n + 1) - n - 1) AS "value" 
    FROM @nums 
    WHERE SUBSTRING(@p, n, 1) = ',' AND n < @len; 

Tenga en cuenta que, teniendo en cuenta el límite de 1.000 longitud de la cadena, debe tener una tabla con 1000 o más filas (dbo.Table en la muestra tsql) para crear la variable de tabla @nums de esta muestra. En el artículo, tienen una tabla de enumeración permanente.

0

acabo logrado algo como esto para crear las tablas de etapas para replicar las tablas de origen mediante las vistas INFORMATION_SCHEMA en un servidor vinculado. Pero esta es una versión modificada para crear los resultados que buscas. Simplemente recuerde eliminar los dos últimos caracteres de la columna Colores al mostrarlo.

SELECT 
    t.Item 
    , (
     SELECT 
      x.Color + ', ' AS [data()] 
     FROM 
      Items x 
     WHERE 
      x.Item = t.Item 
     FOR XML PATH(''), TYPE 
    ).value('.', 'varchar(max)') AS Colors 
FROM 
    Items t 
GROUP BY 
    t.Item