XML Найти и удалить только при наличии текста - PullRequest
0 голосов
/ 06 февраля 2020

Итак, со следующими данными в базе данных предприятия за $ 1025 * 2014:

DECLARE @table TABLE (XmlCol XML)
INSERT INTO @table (XmlCol) VALUES ('
<DEFeatureClassInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:typens="http://www.esri.com/schemas/ArcGIS/10.8" xsi:type="typens:DEFeatureClassInfo">
  <GPFieldInfoExs xsi:type="typens:ArrayOfGPFieldInfoEx">
    <GPFieldInfoEx xsi:type="typens:GPFieldInfoEx">
      <Name>UNITCODE</Name>
      <AliasName>UNITCODE</AliasName>
      <ModelName>UNITCODE</ModelName>
      <FieldType>esriFieldTypeString</FieldType>
      <IsNullable>true</IsNullable>
      <Required>true</Required>
    </GPFieldInfoEx>
    <GPFieldInfoEx xsi:type="typens:GPFieldInfoEx">
      <Name>REGIONCODE</Name>
      <AliasName>REGIONCODE</AliasName>
      <ModelName>REGIONCODE</ModelName>
      <DomainName>DOM_REGIONCODE_NPS2016</DomainName>
      <FieldType>esriFieldTypeString</FieldType>
      <DefaultValueString>SER</DefaultValueString>
      <IsNullable>true</IsNullable>
      <Required>true</Required>
    </GPFieldInfoEx>
    <GPFieldInfoEx xsi:type="typens:GPFieldInfoEx">
      <Name>CREATEUSER</Name>
      <AliasName>CREATEUSER</AliasName>
      <ModelName>CREATEUSER</ModelName>
      <FieldType>esriFieldTypeString</FieldType>
      <DefaultValueString>GRSM User</DefaultValueString>
      <IsNullable>true</IsNullable>
      <Required>true</Required>
    </GPFieldInfoEx>
  </GPFieldInfoExs>
 </DEFeatureClassInfo>')

Я хочу удалить (Элемент? Узел?) На основе критериев. В примере, который я вставил, у меня есть 3 элемента, все с

<Required>true</Required>

Что я хочу сделать, это удалить

<Required>true</Required>

ONLY , когда

<Name>CREATEUSER</Name>

Существует в одном и том же элементе (здесь я могу путать узлы и элементы).

Другими словами, это столбец XML, который определяет схему БД для таблицы, у меня есть сотни таблиц, в которых мне нужно изменить определение схемы XML так, чтобы каждый раз, когда появляется CREATEUSER, значение true удаляется (не изменяется и не заменяется).

Пока что я до

SELECT *
FROM   GDB_ITEMS
WHERE  GDB_ITEMS.Definition.exist(N'//Name[text()="CREATEUSER"]') = 1;

, что заняло у меня 4 часа поиска в Google и показывает мне, по крайней мере, какие таблицы в моей БД имеют CREATEUSER в определении схемы XML. Просто нужно потрогать все это и удалить истину. Для пояснения есть и другие случаи, когда я не не хочу удалять true. В том же примере, опубликованном выше, мы видим true присутствует в узле "UNITCODE", и true нельзя удалить / удалить. Я хочу удалить true только тогда, когда это связано с CREATEUSER.

1 Ответ

1 голос
/ 07 февраля 2020

Пожалуйста, попробуйте следующее.

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (XmlCol XML)
INSERT INTO @tbl (XmlCol) VALUES 
(N'<DEFeatureClassInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xmlns:xs="http://www.w3.org/2001/XMLSchema"
                    xmlns:typens="http://www.esri.com/schemas/ArcGIS/10.8"
                    xsi:type="typens:DEFeatureClassInfo">
    <GPFieldInfoExs xsi:type="typens:ArrayOfGPFieldInfoEx">
        <GPFieldInfoEx xsi:type="typens:GPFieldInfoEx">
            <Name>UNITCODE</Name>
            <AliasName>UNITCODE</AliasName>
            <ModelName>UNITCODE</ModelName>
            <FieldType>esriFieldTypeString</FieldType>
            <IsNullable>true</IsNullable>
            <Required>true</Required>
        </GPFieldInfoEx>
        <GPFieldInfoEx xsi:type="typens:GPFieldInfoEx">
            <Name>REGIONCODE</Name>
            <AliasName>REGIONCODE</AliasName>
            <ModelName>REGIONCODE</ModelName>
            <DomainName>DOM_REGIONCODE_NPS2016</DomainName>
            <FieldType>esriFieldTypeString</FieldType>
            <DefaultValueString>SER</DefaultValueString>
            <IsNullable>true</IsNullable>
            <Required>true</Required>
        </GPFieldInfoEx>
        <GPFieldInfoEx xsi:type="typens:GPFieldInfoEx">
            <Name>CREATEUSER</Name>
            <AliasName>CREATEUSER</AliasName>
            <ModelName>CREATEUSER</ModelName>
            <FieldType>esriFieldTypeString</FieldType>
            <DefaultValueString>GRSM User</DefaultValueString>
            <IsNullable>true</IsNullable>
            <Required>true</Required>
        </GPFieldInfoEx>
    </GPFieldInfoExs>
</DEFeatureClassInfo>');
-- DDL and sample data population, end

-- before
SELECT * FROM @tbl;

DECLARE @NewValue VARCHAR(10) = '';

UPDATE @tbl
SET XmlCol.modify('replace value of 
(/DEFeatureClassInfo/GPFieldInfoExs/GPFieldInfoEx[Name="CREATEUSER"]/Required/text())[1] with (sql:variable("@NewValue"))');

-- after
SELECT * FROM @tbl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...