Home Forums SQL Server 2008 T-SQL (SS2K8) How do you map to rows inside different branches of same XML document using OPENXML rowset function? RE: How do you map to rows inside different branches of same XML document using OPENXML rowset function?

  • LutzM (10/7/2013)


    Here's a slightly different approach without the OPENXML approach (I, personally, find OPENXML more complicted and it seems to be less efficient in most cases):

    SELECT

    TempXML1.Node1.value('(server/text())[1]', 'varchar(50)') AS [server],

    TempXML1.Node1.value('(name/text())[1]', 'varchar(50)') AS [name],

    TempXML1.Node1.value('(start_time/text())[1]', 'varchar(50)') AS [start_time],

    TempXML1.Node1.value('(type/text())[1]', 'varchar(50)') AS [type],

    TempXML1.Node1.value('(log_name/text())[1]', 'varchar(50)') AS [log_name],

    TempXML2.Node2.value('(text())[1]', 'varchar(50)') AS myname ,

    TempXML3.Node3.value('(media_mount_date/text())[1]', 'varchar(50)') AS media_mount_date,

    TempXML3.Node3.value('(drive_name/text())[1]', 'varchar(50)') AS drive_name,

    TempXML3.Node3.value('(media_label/text())[1]', 'varchar(50)') AS media_label,

    TempXML3.Node3.value('(media_guid/text())[1]', 'varchar(50)') AS media_guid,

    TempXML3.Node3.value('(media_overwrite_date/text())[1]', 'varchar(50)') AS media_overwrite_date,

    TempXML3.Node3.value('(media_append_date/text())[1]', 'varchar(50)') AS media_append_date,

    TempXML3.Node3.value('(media_set_target/text())[1]', 'varchar(50)') AS media_set_target

    FROM @xmldocument.nodes('/joblog') TempXML (Node)

    OUTER APPLY TempXML.Node.nodes('header') AS TempXML1(Node1)

    OUTER APPLY TempXML.Node.nodes('media_mount_date') AS TempXML2(Node2)

    OUTER APPLY TempXML.Node.nodes('media_drive_and_media_info') AS TempXML3(Node3)

    No need for all those OUTER APPLIES, you could just do this:

    SELECT

    TempXML.Node.value('(header/server/text())[1]', 'varchar(50)') AS [server1],

    TempXML.Node.value('(header/server/text())[1]', 'varchar(50)') AS [server],

    TempXML.Node.value('(header/name/text())[1]', 'varchar(50)') AS [name],

    TempXML.Node.value('(header/start_time/text())[1]', 'varchar(50)') AS [start_time],

    TempXML.Node.value('(header/type/text())[1]', 'varchar(50)') AS [type],

    TempXML.Node.value('(header/log_name/text())[1]', 'varchar(50)') AS [log_name],

    TempXML.Node.value('(media_mount_date/text())[1]', 'varchar(50)') AS [media_mount_date],

    TempXML.Node.value('(media_drive_and_media_info/drive_name/text())[1]', 'varchar(50)') AS drive_name,

    TempXML.Node.value('(media_drive_and_media_info/media_label/text())[1]', 'varchar(50)') AS media_label,

    TempXML.Node.value('(media_drive_and_media_info/media_guid/text())[1]', 'varchar(50)') AS media_guid,

    TempXML.Node.value('(media_drive_and_media_info/media_overwrite_date/text())[1]', 'varchar(50)') AS media_overwrite_date,

    TempXML.Node.value('(media_drive_and_media_info/media_append_date/text())[1]', 'varchar(50)') AS media_append_date,

    TempXML.Node.value('(media_drive_and_media_info/media_set_target/text())[1]', 'varchar(50)') AS media_set_target

    FROM @xmldocument.nodes('/joblog') TempXML (Node)

    "I cant stress enough the importance of switching from a sequential files mindset to set-based thinking. After you make the switch, you can spend your time tuning and optimizing your queries instead of maintaining lengthy, poor-performing code."

    -- Itzik Ben-Gan 2001