Для вашего следующего вопроса: Пожалуйста, не размещайте фотографии. Лучше всего было предоставить MCVE ( автономный образец для воспроизведения вашей проблемы).
Вы можете попробовать что-то вроде этого:
Это такой автономный образец
DECLARE @mockupTable TABLE(ID INT IDENTITY, YourXml XML);
INSERT INTO @mockupTable VALUES
(N'<PayDetails>
<Column Name="blah" DataType="string" Value="Some blah" />
<Column Name="GROSS" DataType="float" Value="1.1" />
<Column Name="Another" DataType="string" Value="One more" />
<Column Name="GROSS" DataType="float" Value="1.2" />
</PayDetails>')
,(N'<PayDetails>
<Column Name="blah" DataType="string" Value="Some blah" />
<Column Name="GROSS" DataType="float" Value="2.0" />
<Column Name="Another" DataType="string" Value="One more" />
<Column Name="GROSS" DataType="float" Value="2.0" />
</PayDetails>');
- Этот запрос сначала проверит наличие различных значений для GROSS
в одном XML. Это может быть причиной для того, чтобы присмотреться, прежде чем удалять их.
SELECT t.ID
,t.YourXml
FROM @mockupTable t
WHERE t.YourXml.value('count(distinct-values(/PayDetails/Column[@Name="GROSS"]/@Value))','int')>1;
- И этот оператор будет возвращать каждый <Column>
только один раз для имени (всегда первый в своем роде)
UPDATE @mockupTable SET YourXml=YourXml.query(N'
<PayDetails>
{
for $elmt in distinct-values(/PayDetails/Column/@Name)
return /PayDetails/Column[@Name=$elmt][1]
}
</PayDetails>
');
- Проверить вывод
SELECT * FROM @mockupTable
Идея вкратце:
С помощью Xpath /PayDetails/Column[@Name="GROSS"]
мы уменьшаем наблюдаемый набор до столбцов, где атрибут Name
равно GROSS
distinct-values()
- это функция XQuery, возвращающая каждое значение в списке только один раз. Таким образом, мы можем использовать count()
, чтобы проверить, существуют ли различные значения для GROSS
в одном XML.
* UPDATE
использует возможности FLWOR XQuery. Мы снова используем distinct-values
, чтобы получить все значения для Name
в пределах <Column>
. Затем мы возвращаем только первое (см. [1]
) для каждого имени.
ОБНОВЛЕНИЕ: проверка на дублированные элементы
С помощью этого запроса вы можете выполнить всю таблицу для поиска любого неуникальное имя столбца для XML:
SELECT t.YourXml.query(N'
for $elmt in distinct-values(/PayDetails/Column/@Name)
return <NameCount Name="{$elmt}" Count="{count(/PayDetails/Column[@Name=$elmt])}"/>
').query('/NameCount[@Count>1]')
FROM @mockupTable t;