2016-10-11 34 views
3

我有XML數據,我只想將每個鍵值的值連接在一起。下面的代碼接近但不起作用,請告知。我在下面嘗試的是先將XML中的值「拆分」出來,然後將它們重新組合在一起,我希望有更好的方法,否則只需對我的代碼進行更正將不勝感激。獲取來自XML的值串聯字符串

剛一說明:我很難總結我身邊XML是如何在SQL中實現頭,答案可能是顯而易見

SELECT RoleId, 
    /*This part does not work*/ 
    STUFF((SELECT ', ' + Condition 
      FROM filters /*Invalid object name 'filters'.*/ 
      FOR XML PATH ('')), 1,1, '') vals 
    /*This part does not work*/ 
FROM (
    /*This part works*/ 
    SELECT tbl.RoleId, 
     p.value('@Condition', 'VARCHAR(8000)') AS Condition 
    FROM (
     SELECT RoleId, 
      r.RoleName, 
      CAST(Data AS XML) Data 
     FROM dbo.RoleFilters rf 
     INNER JOIN dbo.Roles r 
      ON r.Id = rf.RoleId 
     ) tbl 
    CROSS APPLY Data.nodes('/RoleFilters/Filters/ExpressionInfoGroup/Filters/Expression') t(p) 
    ) filters 

回答

2

您不能使用sub-select別名引用數據。您需要再次使用sub-select,但可以使用CTE來實現。 CTE可以參考N次數

;with filters as 
(
SELECT tbl.RoleId, 
     p.value('@Condition', 'VARCHAR(8000)') AS Condition 
    FROM (
     SELECT RoleId, 
      r.RoleName, 
      CAST(Data AS XML) Data 
     FROM dbo.RoleFilters rf 
     INNER JOIN dbo.Roles r 
      ON r.Id = rf.RoleId 
     ) tbl 
    CROSS APPLY Data.nodes('/RoleFilters/Filters/ExpressionInfoGroup/Filters/Expression') t(p) 
) 
SELECT Distinct RoleId, 
     STUFF((SELECT ', ' + Condition 
      FROM filters 
      FOR XML PATH ('')), 1,1, '') vals 
FROM filters 
+0

就像我說的,答案可能很明顯:)謝謝。這是否沒有「原生」XML功能? –