У меня есть столбец таблицы как nvarchar (max), содержащий следующие данные XML:
<?xml version="1.0" encoding="utf-8"?>
<SerializableAlertDetail xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="SerializableContextAlertDetail">
<ContextName>Evénements PTI mobile</ContextName>
<EnumValueName>Pré Alerte immobilisme</EnumValueName>
</SerializableAlertDetail>
Я хотел бы ВЫБЕРИТЬ конкатенацию XML-элементов 'ContextName' и 'EnumValueName'.
Сначала я просто попытался вернуть один элемент, который отлично работает:
SELECT CAST(REPLACE(dbo.AlertDetail.Context, 'encoding="utf-8"', '') AS XML).value('(/SerializableAlertDetail/*[local-name() = "ContextName"])[1]', 'nvarchar(max)') As DisplayName FROM Table
Поскольку я не хочу приводить дважды в запросе, я ищу способ деструктурировать столбец XMLв таблицу и выберите столбцы отсюда.До сих пор я застрял со следующим недопустимым запросом:
SELECT T0.XML.value('ContextName', 'nvarchar(max)')
FROM Table c
CROSS APPLY (SELECT CAST(REPLACE(c.Context, 'encoding="utf-8"', '') AS XML)) as T(X)
CROSS APPLY T.X.nodes('SerializableAlertDetail') AS T0(XML)
Но он завершается ошибкой со следующим сообщением об ошибке:
XQuery [TXvalue ()]: 'value ()'требуется одиночный (или пустая последовательность) найденный операнд типа' xdt: untypedAtomic * '
Любая помощь приветствуется.
РЕДАКТИРОВАТЬ 1
Я пришел к следующему запросу, который работает, но, возможно, не оптимален:
SELECT T0.XML.query('./ContextName').value('.', 'nvarchar(max)') + T0.XML.query('./EnumValueName').value('.', 'nvarchar(max)')
FROM Table c
CROSS APPLY (SELECT CAST(REPLACE(c.Context, 'encoding="utf-8"', '') AS XML)) as T(X)
CROSS APPLY T.X.nodes('SerializableAlertDetail') AS T0(XML)
РЕДАКТИРОВАТЬ 2
Заменентекст от nvarchar (max);)