How do I remove redundant namespace in nested query when using FOR XML PATH

前端 未结 6 1919
长情又很酷
长情又很酷 2020-11-28 12:54

UPDATE: I\'ve discovered there is a Microsoft Connect item raised for this issue here

When using FOR XML PATH

6条回答
  •  一生所求
    2020-11-28 13:36

    If I have understood correctly, you are referring to the behavior that you might see in a query like this:

    DECLARE @Order TABLE (
      OrderID INT, 
      OrderDate DATETIME)
    
    DECLARE @OrderDetail TABLE (
      OrderID INT, 
      ItemID VARCHAR(1), 
      ItemName VARCHAR(50), 
      Qty INT)
    
    INSERT @Order 
    VALUES 
    (1, '2010-01-01'),
    (2, '2010-01-02')
    
    INSERT @OrderDetail 
    VALUES 
    (1, 'A', 'Drink',  5),
    (1, 'B', 'Cup',    2),
    (2, 'A', 'Drink',  2),
    (2, 'C', 'Straw',  1),
    (2, 'D', 'Napkin', 1)
    
    ;WITH XMLNAMESPACES('http://test.com/order' AS od) 
    SELECT
      OrderID AS "@OrderID",
      (SELECT 
         ItemID AS "@od:ItemID", 
         ItemName AS "data()" 
       FROM @OrderDetail 
       WHERE OrderID = o.OrderID 
       FOR XML PATH ('od.Item'), TYPE)
    FROM @Order o 
    FOR XML PATH ('od.Order'), TYPE, ROOT('xml')
    

    Which gives the following results:

    
      
        Drink
        Cup
      
      
        Drink
        Straw
        Napkin
      
    
    

    As you said, the namespace is repeated in the results of the subqueries.

    This behavior is a feature according to a conversation on devnetnewsgroup (website now defunct) although there is the option to vote on changing it.

    My proposed solution is to revert back to FOR XML EXPLICIT:

    SELECT
      1 AS Tag,
      NULL AS Parent,
      'http://test.com/order' AS [xml!1!xmlns:od],
      NULL AS [od:Order!2],
      NULL AS [od:Order!2!OrderID],
      NULL AS [od:Item!3],
      NULL AS [od:Item!3!ItemID]
    UNION ALL
    SELECT 
      2 AS Tag,
      1 AS Parent,
      'http://test.com/order' AS [xml!1!xmlns:od],
      NULL AS [od:Order!2],
      OrderID AS [od:Order!2!OrderID],
      NULL AS [od:Item!3],
      NULL [od:Item!3!ItemID]
    FROM @Order 
    UNION ALL
    SELECT
      3 AS Tag,
      2 AS Parent,
      'http://test.com/order' AS [xml!1!xmlns:od],
      NULL AS [od:Order!2],
      o.OrderID AS [od:Order!2!OrderID],
      d.ItemName AS [od:Item!3],
      d.ItemID AS [od:Item!3!ItemID]
    FROM @Order o INNER JOIN @OrderDetail d ON o.OrderID = d.OrderID
    ORDER BY [od:Order!2!OrderID], [od:Item!3!ItemID]
    FOR XML EXPLICIT
    

    And see these results:

    
      
        Drink
        Cup
      
      
        Drink
        Straw
        Napkin
      
    
    

提交回复
热议问题