Ваш вопрос не очень понятен ... И это очень хороший пример, почему вы всегда должны добавлять MCVE , включая DDL, примеры данных, собственные попытки, неправильный вывод и ожидаемый вывод. На этот раз я делаю это для вас, пожалуйста, попробуйте подготовить такой MCVE в следующий раз самостоятельно ...
Если я правильно понял, ваша исходная таблица содержит столбец CSV с максимум 8 (макс?) Значениями. Это может быть решено намного проще, нет необходимости разбивать это на два запроса, не нужна промежуточная таблица и даже не PIVOT.
--create a mockup-table to simulate your situation (slightly shortened for brevity)
DECLARE @YourTable TABLE(ID INT,MDDID INT, DeviceNumber VARCHAR(100),MetReading VARCHAR(2000));
INSERT INTO @YourTable VALUES
(2,49101,'NKLDEVELOPMENT02','DCPL,981115,247484,9409') --the character code and some numbers
,(3,49101,'NKLDEVELOPMENT02','SPPL,,,,,,,,') --eigth empty commas
,(4,49101,'NKLDEVELOPMENT02','BLAH,,,999,,'); --A value somewhere in the middle
- Cte вернет таблицу как . Единственная разница - приведение к XML (как вы это сделали)
WITH Splitted AS
(
SELECT ID
,MDDID
,DeviceNumber
,CAST('<x>' + REPLACE(MetReading,',','</x><x>') + '</x>' AS XML) AS Casted
FROM @YourTable t
)
SELECT s.ID
,s.MDDID
,s.DeviceNumber
,s.Casted.value('/x[1]','varchar(100)') AS [1]
,s.Casted.value('/x[2]','varchar(100)') AS [2]
,s.Casted.value('/x[3]','varchar(100)') AS [3]
,s.Casted.value('/x[4]','varchar(100)') AS [4]
,s.Casted.value('/x[5]','varchar(100)') AS [5]
,s.Casted.value('/x[6]','varchar(100)') AS [6]
,s.Casted.value('/x[7]','varchar(100)') AS [7]
,s.Casted.value('/x[8]','varchar(100)') AS [8]
FROM Splitted s;
результат
ID MDDID DeviceNumber 1 2 3 4 5 6 7 8
2 49101 NKLDEVELOPMENT02 DCPL 981115 247484 9409 NULL NULL NULL NULL
3 49101 NKLDEVELOPMENT02 SPPL
4 49101 NKLDEVELOPMENT02 BLAH 999 NULL NULL
Идея вкратце:
Каждый CSV преобразуется в XML, подобный следующему:
<x>DCPL</x>
<x>981115</x>
<x>247484</x>
<x>9409</x>
Используя предикат позиции в XPath, мы можем легко вызвать первый, второй, третий <x>
.