Я переопределил некоторый код для анализа строки с разделителями-запятыми в одном поле в отдельных полях.
Теперь я хочу включить циклы для нумерации новых полей с использованием локальных переменных (я думаю, что это лучший метод), а также их использование в одноэлементном значении [1] et c.
[1] будет [WT1], [2] будет [SA1], [3] = [WT2] , [4] = [SA2], et c
Количество циклов должно быть задано локальной переменной и будет меняться, поэтому я не могу просто сделать конечное число новых полей для вывода.
Мне удалось использовать локальные переменные для замены атрибута в новой строке Xml .value, но я не могу управлять синтаксисом для значения синглтона.
Я предполагаю, что переменная i должен быть преобразован в строку. Я также хочу включить его в l oop для вывода новых имен полей, например. WT1, SA1, WT2, SA2 и т. Д. c.
Я закомментировал циклические строки кода, а также первое поле (WT1) в SELECT, которое я не могу заставить работать, а именно: так же, как строка для существующего WT1.
Надеюсь, я достаточно четко объяснил себя для решения.
DECLARE @t TABLE(
ProductId INT,
ProductName VARCHAR(25),
SupplierId INT,
Descr VARCHAR(50)
)
INSERT INTO @t VALUES (1,'Product1',1,'A1,10in,30in,2lbs');
INSERT INTO @t VALUES (2,'Product2',2,'T6,15in,30in,');
INSERT INTO @t VALUES (3,'Product3',1,'A2,1in,,0.5lbs');
declare @i int;
set @i=1;
declare @prodatt VARCHAR(25);
set @prodatt ='Attribute';
--while @i < 8
--begin
SELECT
-- NewXML.value('(/Product[1]/Attribute[*[local-name() = sql:variable("@i")])]','varchar(25)') AS [WT1],
NewXML.value('(/Product[1]/*[local-name() = sql:variable("@prodatt")])[2]','varchar(25)') AS [SA1],
NewXML.value('/Product[1]/Attribute[1]','varchar(25)') AS [WT1],
-- NewXML.value('/Product[1]/Attribute[2]','varchar(25)') AS [SA1],
NewXML.value('/Product[1]/Attribute[3]','varchar(25)') AS [WT2],
NewXML.value('/Product[1]/Attribute[4]','varchar(25)') AS [SA2],
[ProductID],
[SupplierId]
FROM @t t1
CROSS APPLY (SELECT XMLEncoded=(SELECT Descr AS [*] FROM @t t2 WHERE t1.ProductId = t2.[ProductId] FOR XML PATH(''))) EncodeXML
CROSS APPLY (SELECT NewXML=CAST('<Product><Attribute>'+REPLACE(XMLEncoded,',','</Attribute><Attribute>')+'</Attribute></Product>' AS XML)) CastXML