none
for xml explicit RRS feed

  • שאלה

  • היי.

    אני מייצר XML באמצעות "for xml explicit". יש לי בעיה שתג מסוים "טועה" בהורה של עצמו וחוזר תחת תג אב אחר.

    אני יודע שקביעת ההורה נעשית ע"י  13 as tag, 2 as parent, וזה בסדר, הטעות אצלי היא שהתג הספציפי בוחר תג אב שגוי מרמה 2.

    מה יכולות להיות הסיבות לעניין? ואיך בדיוק נקבע האב?

    כל השדות שרלוונטים לקישור בין הבן לאב זהים, ולכן אני כן מצפה שלא תתרחש הטעות.

    מצטער שלא צרפתי קוד, הוא פשוט די ארוך. אני מקווה שיש כמה סממנים מוכרים או סיבות נפוצות לתקלה דומה.

    תודה!


    itaigitt, http://copypastenet.blogspot.com

    יום ראשון 17 יוני 2012 10:29

תשובות

  • הי איתי,

    הבעיה שאתה מתאר בדרך-כלל קשורה למיון. השאילתה שבונה את ה-XML מן הסתם מורכבת מכמה תת-שאילתות עם UNION ALL ביניהן, כאשר כל תת שאילתה מייצגת רמה אחרת בעץ. אתה חייב לכלול בכל אחת מהשאילתות האלה את שדות המפתח שמופיעים בכל הרמות מעל, ואז אתה צריך למיין את כל השאילתה לפי שדות המפתח.

    זה צריך להיות משהו כזה:

    SELECT
    	Tag									= 1 ,
    	Parent								= NULL ,
    	[Resource!1!ResourceId]				= ResourceTable.ResourceId ,
    	[Resource!1!ResourceName!element]	= ResourceTable.ResourceName ,
    	[OwnerOf!2!Id]						= NULL ,
    	[OwnerOf!2!ResourceId]				= NULL ,
    	[OwnerOf!2!OtherRscName!element]	= NULL
    FROM
    	dbo.ResourceTable
    
    UNION ALL
    
    SELECT
    	Tag									= 2 ,
    	Parent								= 1 ,
    	[Resource!1!ResourceId]				= OwnerOfTable.ResourceId ,
    	[Resource!1!ResourceName!element]	= NULL ,
    	[OwnerOf!2!Id]						= OwnerOfTable.Id ,
    	[OwnerOf!2!ResourceId]				= OwnerOfTable.ResourceId ,
    	[OwnerOf!2!OtherRscName!element]	= OwnerOfTable.OtherRscName
    FROM
    	dbo.OwnerOfTable
    
    ORDER BY
    	[Resource!1!ResourceId]	ASC ,
    	[OwnerOf!2!Id]			ASC;
    GO
    

    מקווה שעזרתי...

    בהצלחה!

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    Madeira - SQL Server Services
    http://www.madeira.co.il


    יום שני 18 יוני 2012 04:04
    מנחה דיון

כל התגובות

  • אין באג לידעתי ואני מניח שהטעות אצלך אבל בלי קוד קצת קשה לי לנחש אפילו על מה הבעיה שאתה מציג

    אולי תנסה להעלות משהו בסיסי של DDL לטבלה פשוטה עם שדה בודד של XML ו DML של הנתון שיוצר לך בעיה ואז תצרף לנו שאילתה לדוגמה של הבעיה?

    * לא חייבים לצרף תמיד DDL+DML מקורי אם הוא ארוך ואפילו עדיף לסנן את הבעיה למצב בסיסי.


    signature

    יום ראשון 17 יוני 2012 11:05
    מנחה דיון
  • אני יודע שקשה בלי קוד ולכן אני מצרף בד"כ, אבל פה קשה לי לצמצם את הקוד כי אני לא ממש יודע באיזה חלק הבעיה נמצאת (ולכן גם עוד לא מצאתי את הפתרון...)

    בכל מקרה, אני מצרף משהו מה=XML כדי להמחיש את הבעיה:

      <Resource ResourceID="100" ...>
        <ResourceName><![CDATA[aaaa]]></ResourceName>
        <OwnerOf ID="111" ResourceID="57"...>
          <OtherRscName><![CDATA[bbbb]]></OtherRscName>
        </OwnerOf>
      </Resource>
      <Resource ResourceID="57" ...>
        <ResourceName><![CDATA[bbbb]]></ResourceName>
      </Resource>

    הבעיה היא ש-ownerOf מס' 111 אמור לחזור תחת ResourceID 57 ולא 100.

    בשאילתא בקוד שעליה עושים for xml explicit האב נראה תקין, אז אני מניח שזה משהו שאני לא יודע בהקשר של ה-for xml explicit או פיצ'ר שאני לא מכיר.


    itaigitt, http://copypastenet.blogspot.com

    יום ראשון 17 יוני 2012 11:15
  • יעזור לך מדריך מלא טוב לעבודה עם XML ?

    * מהנתונים שלך אין לי שום דרך להבין את הבעיה. אני רק מבין שיש בעיה. לפחות צרף לנו את השאילתה באמצעותה אתה ניגש לנתון ויוצרת לך את הבעיה. כמו כן צרף XML עם מסלול מלא (לא צריך את כל ה XML אבל חייבים את המסלול המלא כדי להבין החל מה ROOT והתאג הראשון שמגדיר את התקן של ה XML בו אתה עובד)


    signature

    יום ראשון 17 יוני 2012 13:50
    מנחה דיון
  • הי איתי,

    הבעיה שאתה מתאר בדרך-כלל קשורה למיון. השאילתה שבונה את ה-XML מן הסתם מורכבת מכמה תת-שאילתות עם UNION ALL ביניהן, כאשר כל תת שאילתה מייצגת רמה אחרת בעץ. אתה חייב לכלול בכל אחת מהשאילתות האלה את שדות המפתח שמופיעים בכל הרמות מעל, ואז אתה צריך למיין את כל השאילתה לפי שדות המפתח.

    זה צריך להיות משהו כזה:

    SELECT
    	Tag									= 1 ,
    	Parent								= NULL ,
    	[Resource!1!ResourceId]				= ResourceTable.ResourceId ,
    	[Resource!1!ResourceName!element]	= ResourceTable.ResourceName ,
    	[OwnerOf!2!Id]						= NULL ,
    	[OwnerOf!2!ResourceId]				= NULL ,
    	[OwnerOf!2!OtherRscName!element]	= NULL
    FROM
    	dbo.ResourceTable
    
    UNION ALL
    
    SELECT
    	Tag									= 2 ,
    	Parent								= 1 ,
    	[Resource!1!ResourceId]				= OwnerOfTable.ResourceId ,
    	[Resource!1!ResourceName!element]	= NULL ,
    	[OwnerOf!2!Id]						= OwnerOfTable.Id ,
    	[OwnerOf!2!ResourceId]				= OwnerOfTable.ResourceId ,
    	[OwnerOf!2!OtherRscName!element]	= OwnerOfTable.OtherRscName
    FROM
    	dbo.OwnerOfTable
    
    ORDER BY
    	[Resource!1!ResourceId]	ASC ,
    	[OwnerOf!2!Id]			ASC;
    GO
    

    מקווה שעזרתי...

    בהצלחה!

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    Madeira - SQL Server Services
    http://www.madeira.co.il


    יום שני 18 יוני 2012 04:04
    מנחה דיון
  • תודה!

    itaigitt, http://copypastenet.blogspot.com

    יום שני 18 יוני 2012 09:02