باستخدام SQL Server 2005 XQuery حدد كافة العقد مع سمة محددة القيمة ، أو أن السمة مفقودة

StackOverflow https://stackoverflow.com/questions/90023

  •  01-07-2019
  •  | 
  •  

سؤال

تحديث:إعطاء أكثر من ذلك بكثير شامل سبيل المثال.

أول اثنين من الحلول المعروضة على طول خطوط ما كنت أحاول أن أقول لا أن تفعل.لا أستطيع أن أعرف المكان ، فإنه يحتاج إلى أن تكون قادرة على النظر في الوثيقة بأكملها شجرة.لذلك الحل على طول هذه الخطوط, مع /كتب/ على النحو المحدد في السياق لا تعمل:

SELECT x.query('.') FROM @xml.nodes('/Books/*[not(@ID) or @ID = 5]') x1(x)

السؤال الأصلي مع أفضل سبيل المثال:

باستخدام SQL Server 2005 XQuery تنفيذ كنت بحاجة إلى تحديد كافة العقد في مستند XML مرة واحدة فقط كل و الحفاظ على الهيكل الأصلي ، ولكن فقط إذا كانت مفقودة سمة معينة ، أو أن ينسب له قيمة محددة (مرت من قبل المعلمة).الاستعلام أيضا إلى العمل على كامل مستند XML (سليل أو الذات محور) بدلا من اختيار في معرفة مسبقا العمق.

وهذا هو القول ، كل عقدة سوف تظهر في الوثيقة الناتجة إلا إذا كان كل واحد من أجداده مفقودة السمة أو السمة مع واحد قيمة محددة.

على سبيل المثال:

إذا كانت هذه XML:

    DECLARE @Xml XML
    SET @Xml =
    N'
<Library>
  <Novels>
    <Novel category="1">Novel1</Novel>
    <Novel category="2">Novel2</Novel>
    <Novel>Novel3</Novel>
    <Novel category="4">Novel4</Novel>
  </Novels>
  <Encyclopedias>
    <Encyclopedia>
      <Volume>A-F</Volume>
      <Volume category="2">G-L</Volume>
      <Volume category="3">M-S</Volume>
      <Volume category="4">T-Z</Volume>
    </Encyclopedia>
  </Encyclopedias>
  <Dictionaries category="1">
    <Dictionary>Webster</Dictionary>
    <Dictionary>Oxford</Dictionary>
  </Dictionaries>
</Library>
    '

معلمة من 1 فئة من شأنه أن يؤدي هذا:

<Library>
  <Novels>
    <Novel category="1">Novel1</Novel>
    <Novel>Novel3</Novel>
  </Novels>
  <Encyclopedias>
    <Encyclopedia>
      <Volume>A-F</Volume>
    </Encyclopedia>
  </Encyclopedias>
  <Dictionaries category="1">
    <Dictionary>Webster</Dictionary>
    <Dictionary>Oxford</Dictionary>
  </Dictionaries>
</Library>

معلمة من 2 الفئة من شأنه أن يؤدي هذا:

<Library>
  <Novels>
    <Novel category="2">Novel2</Novel>
    <Novel>Novel3</Novel>
  </Novels>
  <Encyclopedias>
    <Encyclopedia>
      <Volume>A-F</Volume>
      <Volume category="2">G-L</Volume>
    </Encyclopedia>
  </Encyclopedias>
</Library>

أنا أعرف XSLT هي مناسبة تماما لهذه المهمة, لكنه ليس خيارا.لدينا لإنجاز هذا تماما في SQL Server 2005.أي تطبيقات لا تستخدم XQuery على ما يرام أيضا ، طالما أنه يمكن القيام به تماما في T-SQL.

هل كانت مفيدة؟

المحلول

انها ليست واضحة بالنسبة لي من المثال الخاص بك ما كنت فعلا تحاول تحقيق.هل تريد العودة XML جديد مع كافة العقد تجريده ما عدا تلك التي تفي الشرط ؟ إذا كان هذا يبدو مثل العمل على تحويل XSLT التي لا اعتقد انها بنيت في MSSQL 2005 (يمكن إضافة UDF: http://www.topxml.com/rbnews/SQLXML/re-23872_Performing-XSLT-Transforms-on-XML-Data-Stored-in-SQL-Server-2005.aspx).

إذا كنت بحاجة فقط الى عودة قائمة العقد ثم يمكنك استخدام هذا التعبير:

//Book[not(@ID) or @ID = 5]

ولكن لدي انطباع أنه ليس ما تحتاجه.سيكون من المفيد إذا كنت يمكن أن توفر أكثر وضوحا سبيل المثال.

تحرير:هذا المثال هو في الواقع أكثر وضوحا.أفضل ما يمكن أن تجد هذا:

SET @Xml.modify('delete(//*[@category!=1])')
SELECT @Xml

الفكرة هي أن تحذف من XML جميع العقد التي لا تحتاج لذلك كنت لا تزال مع الهيكل الأصلي و يلزم العقد.أنا اختبرت مع اثنين من الأمثلة أنتجت النتيجة المطلوبين.

ومع ذلك تعديل لديه بعض القيود - على ما يبدو لا يمكنك استخدامه في تحديد بيان له إلى تعديل البيانات في المكان.إذا كنت بحاجة إلى العودة هذه البيانات مع تحديد هل يمكن استخدام جدول مؤقت في نسخ البيانات الأصلية و من ثم تحديث هذا الجدول.شيء من هذا القبيل:

INSERT INTO #temp VALUES(@Xml)
UPDATE #temp SET data.modify('delete(//*[@category!=2])')

على أمل أن يساعد.

نصائح أخرى

السؤال ليس واضحا حقا ، ولكن هل هذا هو ما تبحث عنه ؟

DECLARE @Xml AS XML
        SET @Xml =
        N'
        <Books>
                <Book ID="1">Book1</Book>
                <Book ID="2">Book2</Book>
                <Book ID="3">Book3</Book>
                <Book>Book4</Book>
                <Book ID="5">Book5</Book>
                <Book ID="6">Book6</Book>
                <Book>Book7</Book>
                <Book ID="8">Book8</Book>
        </Books>
        '
DECLARE @BookID AS INT
SET @BookID = 5
DECLARE @Result AS XML

SET @result = (SELECT @xml.query('//Book[not(@ID) or @ID = sql:variable("@BookID")]'))
SELECT @result
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top