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.
A partir de SQL Server 2016 podría hacerse con las funciones OPENJSON y JSON_VALUE .
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