मैं कैसे कर सकते हैं गतिशील रूप से बदलने के लिए XML संरचना के एक स्ट्रिंग SQL

0

सवाल

मैं की जरूरत है एक SQL स्क्रिप्ट होगा कि पुल करने के लिए एक XML स्ट्रिंग से डीबी [varchar(max)], यह निरीक्षण किया, और यह अद्यतन करें यदि यह फिट बैठता है एक विशिष्ट स्थिति है.

कल्पना कीजिए कि मेरी xml में निम्न स्वरूप है:

<root>
  <level1>
    <level2>
      <level3 />
      <level3 />
    </level2>
  </level1>
  <level1>
    <level2>
      <level3>
        <level4>
          <level5>
            <level6 here="now is the time for XYZ">
              <options>
                <option this="that" />
                <option me="you" />
              </options>
            </level6>
          </level5>
        </level4>
      </level3>
    </level2>
  </level1>
  <level1>
    <level2>
      <level3>
        <level4>
          <level5>
            <level6 here="this one is not of interest">
              <options>
                <option this="that" />
                <option me="you" />
              </options>
            </level6>
          </level5>
        </level4>
      </level3>
    </level2>
  </level1>
  <level1>
    <level2>
      <level3>
        <level4>
          <level5>
            <level6 here="now is the time for ABC">
              <options>
                <option this="that" />
                <option me="you" />
                <option here="now" />
              </options>
            </level6>
          </level5>
        </level4>
      </level3>
    </level2>
  </level1>
</root>

तो, क्या मैं क्या करना चाहते है अद्यतन करने के लिए सभी तत्वों जिसका नाम है "level6" और है, जो एक विशेषता बुलाया "यहाँ" जिसका मूल्य शुरू होता है के साथ "अब समय आ गया है". तो, होना चाहिए कि मैच सिर्फ दो तत्वों से ऊपर.

लेकिन, नहीं है कि केवल एक ही चयन के मापदंड. के विकल्पों की सूची में शामिल नहीं करना चाहिए <option here="now" />. तो, कि हमें छोड़ देना चाहिए सिर्फ एक तत्व को अद्यतन करने के लिए.

<level6 here="now is the time for XYZ">
    <options>
        <option this="that" />
        <option me="you" />
    </options>
 </level6>

उस तत्व के लिए, मैं तो जोड़ने के लिए चाहते हैं लापता <option here="now" />, इतना है कि हो जाता है:

<level6 here="now is the time for XYZ">
    <options>
        <option this="that" />
        <option me="you" />
        <option here="now" />
    </options>
 </level6>

तो, अंत परिणाम होना चाहिए:

 <root>
  <level1>
    <level2>
      <level3 />
      <level3 />
    </level2>
  </level1>
  <level1>
    <level2>
      <level3>
        <level4>
          <level5>
            <level6 here="now is the time for XYZ">
              <options>
                <option this="that" />
                <option me="you" />
                <option here="now" />      // <- this one new
              </options>
            </level6>
          </level5>
        </level4>
      </level3>
    </level2>
  </level1>
  <level1>
    <level2>
      <level3>
        <level4>
          <level5>
            <level6 here="this one is not of interest">
              <options>
                <option this="that" />
                <option me="you" />
              </options>
            </level6>
          </level5>
        </level4>
      </level3>
    </level2>
  </level1>
  <level1>
    <level2>
      <level3>
        <level4>
          <level5>
            <level6 here="now is the time for ABC">
              <options>
                <option this="that" />
                <option me="you" />
                <option here="now" />
              </options>
            </level6>
          </level5>
        </level4>
      </level3>
    </level2>
  </level1>
</root>

लगता है कि मैं डेटा पढ़ सकते हैं बाहर की डीबी में एक स्ट्रिंग, और मुझे पता है कि कैसे DB अद्यतन करने के लिए, तो यह वास्तव में हेरफेर करने के लिए कैसे xml स्ट्रिंग SQL (एसक्यूएल सर्वर).

sql-server tsql xml xquery
2021-11-23 17:17:51
1

सबसे अच्छा जवाब

1

आप उपयोग कर सकते हैं XML DML (डेटा के संशोधन के साथ) .modify समारोह को बदलने के लिए XML.

SET @xml.modify('
  insert <option here="now" />
  as last into
  ( /root/level1/level2/level3/level4/level5/level6
     [substring(@here, 1, 15) = "now is the time"]
     /options [not(/option[@here = "now"])]
   )[1]');

यह काम करता है के रूप में इस प्रकार है:

  • insert <option here="now" /> यह मूल्य है हम कर रहे हैं डालने
  • as last into यह हो जाता है के बाद अन्य बच्चे नोड्स के लिए चयनित एक
  • /root/level1/level2/level3/level4/level5/level6 यह हमें हो जाता है कि level6 नोड
  • [substring(@here, 1, 15) = "now is the time"] predicates नोड के लिए एक here विशेषता के साथ शुरू है कि मूल्य. आप संशोधित करना आवश्यक लंबाई पैरामीटर से मेल करने के लिए आप मूल्य की तुलना कर रहे हैं. वहाँ कोई नहीं है LIKE में XQuery
  • /options [not(/option[@here = "now"])] हम एक के लिए देखो options नोड है जो कोई option बच्चे जो बारी में एक here="now" विशेषता
  • [1] इस तरह की पहली नोड

अगर आप की जरूरत है को संशोधित करने के लिए कई नोड्स के भीतर एक एकल XML दस्तावेज़ में, आप की जरूरत है चलाने के लिए इस पाश में

DECLARE @i int = 20; --max nodes

WHILE @xml.exist('
  /root/level1/level2/level3/level4/level5/level6
     [substring(@here, 1, 15) = "now is the time"]
     /options [not(option[@here = "now"])]
   ') = 1
BEGIN

    SET @xml.modify('
      insert <option here="now" /> as last into
      ( /root/level1/level2/level3/level4/level5/level6
         [substring(@here, 1, 15) = "now is the time"]
         /options [not(option[@here = "now"])]
       )[1]');
     
    SET @i -= 1;
    IF @i = 0
        BREAK;
END;

आप भी कर सकते हैं यह करने के लिए एक पूरी तालिका

DECLARE @i int = 20; --max nodes

WHILE EXISTS (SELECT 1
    FROM YourTable
    WHERE XmlColumn.exist('
      /root/level1/level2/level3/level4/level5/level6
         [substring(@here, 1, 15) = "now is the time"]
         /options [not(option[@here = "now"])]
       ') = 1)
BEGIN

    UPDATE t
    SET XmlColumn.modify('
      insert <option here="now" /> as last into
      ( /root/level1/level2/level3/level4/level5/level6
         [substring(@here, 1, 15) = "now is the time"]
         /options [not(option[@here = "now"])]
       )[1]')
    FROM YourTable t
    WHERE XmlColumn.exist('
      /root/level1/level2/level3/level4/level5/level6
         [substring(@here, 1, 15) = "now is the time"]
         /options [not(option[@here = "now"])]
       ') = 1;
     
    SET @i -= 1;
    IF @i = 0
        BREAK;
END;

के लिए बहुत बड़े डेटासेट यह हो सकता है तेजी से पुनर्निर्माण के लिए पूरे XML का उपयोग कर XQuery, के साथ अतिरिक्त नोड का उपयोग कर जोड़ा निर्माण XML.

db<>बेला

2021-11-23 23:41:04

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में