válido string_split separar por objeto nombre into delimitada comas columns cadena arrays tsql split cursor

arrays - string_split - Cómo dividir una cadena y guardarla en una matriz en T-SQL



sql server split string into columns (4)

Estoy escribiendo un cursor para completar los datos en la nueva tabla de la tabla principal que contiene datos de la manera siguiente

Colores del artículo
Camisa roja, azul, verde, amarilla

Quiero rellenar los nuevos datos de la tabla obteniendo el elemento y luego agregarlo en fila, de acuerdo con cada color que contiene

Color del artículo
Camisa roja
Camisa azul
Camisa verde
Camisa amarilla

Estoy atrapado en cómo

1) Delimitar / dividir cadena de "colores" 2) Para guardarlo en una matriz 3) Para usarlo en el cursor

ya que voy a usar el cursor anidado para este propósito.


Usando Sql Server 2005+ y el tipo de datos XML, puede echar un vistazo a los siguientes

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)


El artículo Faking Arrays en Transact SQL detalla VARIAS técnicas para resolver este problema, desde el uso de la función PARSENAME () (límite de 5 elementos) hasta la escritura de funciones CLR.

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

Combinando algunos de los consejos, resolví mi problema de división de cuerdas 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, considerando 1000 su límite de longitud de 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.



Acabo de lograr algo como esto para crear tablas de etapas para replicar las tablas fuente usando 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