更新 SQL Server 中的 XML 文件(带有命名空间)

2022-01-17 00:00:00 xml sql-update sql-server

我的xml文件代码如下:

My code with xml file looks like :

DECLARE @t TABLE (rowId INT IDENTITY PRIMARY KEY, yourXML XML)

INSERT INTO @t (yourXML)
    SELECT '<ns2:zarejestrujStanZgodyAsync xmlns:ns2="http://cyfrowypolsat.pl/interfejsy/zgody/v4/zgodyKlienckie" xmlns:ns10="http://cyfrowypolsat.pl/interfejsy/Rozliczenia/Dokumenty/v2/Nota" xmlns:ns11="http://cyfrowypolsat.pl/interfejsy/Rozliczenia/Dokumenty/v2/FakturaDoZamowienia" xmlns:ns12="http://cyfrowypolsat.pl/interfejsy/Rozliczenia/Core/v2/Konto" xmlns:ns13="http://cyfrowypolsat.pl/uslugi/windykacja/v2/Konto" xmlns:ns14="http://cyfrowypolsat.pl/uslugi/rozliczenia/v2/Konto" xmlns:ns3="http://cyfrowypolsat.pl/interfejsy/crossPromocje/v2/PowiadomieniaZwrotne" xmlns:ns4="http://cyfrowypolsat.pl/uslugi/polecenieZaplaty/v1/Konto" xmlns:ns5="http://cyfrowypolsat.pl/interfejsy/Rozliczenia/Core/v2/KontraktRatalny" xmlns:ns6="http://cyfrowypolsat.pl/interfejsy/Rozliczenia/Core/v3/Kontrakt" xmlns:ns7="http://cyfrowypolsat.pl/interfejsy/Rozliczenia/Core/v2/FakturaCykliczna" xmlns:ns8="http://cyfrowypolsat.pl/interfejsy/bdth/rozliczenie/v3/FakturySprzedazowe" xmlns:ns9="http://cyfrowypolsat.pl/interfejsy/Rozliczenia/Core/v3/KontraktRatalny">
  <metryka>
    <uzytkownik>om-system</uzytkownik>
    <system>OM</system>
    <data>2018-12-17T19:09:52.534</data>
    <uid>962B7A95-5663-4694-9226-B4216270D404</uid>
    <nazwaKwalifikowanaInterfejsuWywolywanego>{http://cyfrowypolsat.pl/interfejsy/zgody/v4/zgodyKlienckie}zarejestrujStanZgodyAsync</nazwaKwalifikowanaInterfejsuWywolywanego>
  </metryka>
  <rejestrujStanZgody>
    <idPoziomy>4</idPoziomy>
    <idReferencji>112070742</idReferencji>
    <idPaczki>962B7A95-5663-4694-9226-B4216270D404</idPaczki>
    <idStanyWoliKlienta>2</idStanyWoliKlienta>
    <idTypyZgod>1027</idTypyZgod>
    <dataWaznosciOd>2018-12-17T11:01:55.833</dataWaznosciOd>
    <idSystemy>13</idSystemy>
    <idPrzyczynyZmianyWpisu>4</idPrzyczynyZmianyWpisu>
    <idTypyUmow>1516</idTypyUmow>
    <operatorModyfikujacy>POLSATCprocessEngine</operatorModyfikujacy>
    <idProcesuSprzedazowego>RETENTION</idProcesuSprzedazowego>
  </rejestrujStanZgody>
  <rejestrujStanZgody>
    <idPoziomy>4</idPoziomy>
    <idReferencji>112070742</idReferencji>
    <idPaczki>962B7A95-5663-4694-9226-B4216270D404</idPaczki>
    <idStanyWoliKlienta>1</idStanyWoliKlienta>
    <idTypyZgod>1028</idTypyZgod>
    <dataWaznosciOd>2018-12-17T11:01:55.843</dataWaznosciOd>
    <idSystemy>13</idSystemy>
    <idPrzyczynyZmianyWpisu>4</idPrzyczynyZmianyWpisu>
    <idTypyUmow>1516</idTypyUmow>
    <operatorModyfikujacy>POLSATCprocessEngine</operatorModyfikujacy>
    <idProcesuSprzedazowego>RETENTION</idProcesuSprzedazowego>
  </rejestrujStanZgody>
  <rejestrujStanZgody>
    <idPoziomy>4</idPoziomy>
    <idReferencji>112070742</idReferencji>
    <idPaczki>962B7A95-5663-4694-9226-B4216270D404</idPaczki>
    <idStanyWoliKlienta>2</idStanyWoliKlienta>
    <idTypyZgod>1110</idTypyZgod>
    <dataWaznosciOd>2018-12-17T11:01:55.873</dataWaznosciOd>
    <idSystemy>13</idSystemy>
    <idPrzyczynyZmianyWpisu>4</idPrzyczynyZmianyWpisu>
    <idTypyUmow>1516</idTypyUmow>
    <operatorModyfikujacy>POLSATCprocessEngine</operatorModyfikujacy>
    <idProcesuSprzedazowego>RETENTION</idProcesuSprzedazowego>
  </rejestrujStanZgody>
  <rejestrujStanZgody>
    <idPoziomy>4</idPoziomy>
    <idReferencji>112070742</idReferencji>
    <idPaczki>962B7A95-5663-4694-9226-B4216270D404</idPaczki>
    <idStanyWoliKlienta>2</idStanyWoliKlienta>
    <idTypyZgod>1092</idTypyZgod>
    <dataWaznosciOd>2018-12-17T11:01:55.863</dataWaznosciOd>
    <idSystemy>13</idSystemy>
    <idPrzyczynyZmianyWpisu>4</idPrzyczynyZmianyWpisu>
    <idTypyUmow>1516</idTypyUmow>
    <operatorModyfikujacy>POLSATCprocessEngine</operatorModyfikujacy>
    <idProcesuSprzedazowego>RETENTION</idProcesuSprzedazowego>
  </rejestrujStanZgody>
  <rejestrujStanZgody>
    <idPoziomy>4</idPoziomy>
    <idReferencji>112070742</idReferencji>
    <idPaczki>962B7A95-5663-4694-9226-B4216270D404</idPaczki>
    <idStanyWoliKlienta>1</idStanyWoliKlienta>
    <idTypyZgod>1065</idTypyZgod>
    <dataWaznosciOd>2018-12-17T11:01:55.857</dataWaznosciOd>
    <idSystemy>13</idSystemy>
    <idPrzyczynyZmianyWpisu>4</idPrzyczynyZmianyWpisu>
    <idTypyUmow>1516</idTypyUmow>
    <operatorModyfikujacy>POLSATCprocessEngine</operatorModyfikujacy>
    <idProcesuSprzedazowego>RETENTION</idProcesuSprzedazowego>
  </rejestrujStanZgody>
</ns2:zarejestrujStanZgodyAsync>'



SELECT 'before' s, DATALENGTH(yourXML) dl, yourXML
FROM @t
WHERE rowId = 1

-- Update one attribute
UPDATE @t
SET yourXML.modify('replace value of (zarejestrujStanZgodyAsync/rejestrujStanZgody/idSystemy/text())[1] with "38"')
WHERE rowId = 1

SELECT 'after' s, DATALENGTH(yourXML) dl, yourXML
FROM @t
WHERE rowId = 1

我不知道我在这里做错了什么......

I don't know what I am doing wrong here...

我想换行

<idSystemy>13</idSystemy>

到:

<idSystemy>38</idSystemy>

我知道这段代码只会改变我的 xml 的第一个变量.我应该如何正确地做 + 我该怎么做才能在我的整个 xml 文件中更改它?

I know this code is going to change only the first variable of my xml. How should I do it correctly + what can I do to change this in my whole xml file?

当我使用我的代码时,我从来没有得到预期的值.

When I use my code, I never got the expected value.

提前感谢您的任何提示.

Thanks in advance for any tips.

推荐答案

为了更新这个数字,我只使用了这个代码:

To update this number i used just this code:

UPDATE @t
SET yourXML.modify('replace value of (//*/rejestrujStanZgody/idSystemy/text())[1] with ("38")')
WHERE rowId = 1

而且效果很好(使用命名空间,我们需要构建这样的路径 //* 以避免 ns2:zarejestrujStanZgodyAsync

and it works perfect (with namespaces we need to build path like this //* to avoid ns2:zarejestrujStanZgodyAsync

相关文章