Вы можете попробовать кое-что по этому поводу:
DECLARE @str VARCHAR(1000)='plants=indoor,succulents&locations=ca,co,az&priceupto=100';
SELECT CAST('<x content="' + REPLACE(REPLACE(REPLACE(@str,',','</y><y>'),'=','"><y>'),'&','</y></x><x content="') + '"</y></x>' AS XML);
Мы используем некоторые замены, чтобы преобразовать вашу строку в XML
<x content="plants">
<y>indoor</y>
<y>succulents</y>
</x>
<x content="locations">
<y>ca</y>
<y>co</y>
<y>az</y>
</x>
<x content="priceupto">
<y>100"</y>
</x>
Как использовать это
Проверьте это как ваш последний запрос
DECLARE @str VARCHAR(1000)='plants=indoor,succulents&locations=ca,co,az&priceupto=100';
SELECT A.plants.value('text()[1]','varchar(100)') AS Plant
,B.locations.value('text()[1]','varchar(100)') AS [Location]
,C.priceupto.value('text()[1]','varchar(100)') AS PriceUpTo
FROM (VALUES(CAST('<x content="' + REPLACE(REPLACE(REPLACE(@str,',','</y><y>'),'=','"><y>'),'&','</y></x><x content="') + '</y></x>' AS XML))) The(StringAsXml)
CROSS APPLY The.StringAsXml.nodes('/x[@content="plants"]/y') A(plants)
CROSS APPLY The.StringAsXml.nodes('/x[@content="locations"]/y') B(locations)
CROSS APPLY The.StringAsXml.nodes('/x[@content="priceupto"]/y') C(priceupto);
Результат
Plant Location PriceUpTo
indoor ca 100
indoor co 100
indoor az 100
succulents ca 100
succulents co 100
succulents az 100
Идея вкратце:
Использование CROSS APPLY
с .nodes()
добавит список каждое значение ниже заданного XPath.
Это создаст каждый-с-каждым результат, аналогичный CROSS JOIN
ing сетам.
, если ваш priceupto
является одним единственным элементом во всех ваших случаях это может быть упрощено, конечно, с тем же результатом:
SELECT A.plants.value('text()[1]','varchar(100)') AS Plant
,B.locations.value('text()[1]','varchar(100)') AS [Location]
,the.StringAsXml.value('(/x[@content="priceupto"]/y/text())[1]','varchar(100)') AS PriceUpTo
FROM (VALUES(CAST('<x content="' + REPLACE(REPLACE(REPLACE(@str,',','</y><y>'),'=','"><y>'),'&','</y></x><x content="') + '</y></x>' AS XML))) The(StringAsXml)
CROSS APPLY The.StringAsXml.nodes('/x[@content="plants"]/y') A(plants)
CROSS APPLY The.StringAsXml.nodes('/x[@content="locations"]/y') B(locations)