2010-04-29 51 views
2

如何使用FOR XML/sql查詢獲得如下輸出。我不知道如何將列值作爲元素而不是表格的列名稱。我使用SQL Server 2005用於XML語法的SQL SERVER

我有表SCEMA如下

CREATE TABLE PARENT 
(
PID INT, 
PNAME VARCHAR(20) 
) 

CREATE TABLE CHILD 
(
PID INT, 
CID INT, 
CNAME VARCHAR(20) 
) 

CREATE TABLE CHILDVALUE 
(
CID INT, 
CVALUE VARCHAR(20) 
) 

INSERT INTO PARENT VALUES (1, 'SALES1') 
INSERT INTO PARENT VALUES (2, 'SALES2') 

INSERT INTO CHILD VALUES (1, 1, 'FOR01') 
INSERT INTO CHILD VALUES (1, 2, 'FOR02') 
INSERT INTO CHILD VALUES (2, 3, 'FOR03') 
INSERT INTO CHILD VALUES (2, 4, 'FOR04') 

INSERT INTO CHILDVALUE VALUES (1, '250000') 
INSERT INTO CHILDVALUE VALUES (2, '400000') 
INSERT INTO CHILDVALUE VALUES (3, '500000') 
INSERT INTO CHILDVALUE VALUES (4, '800000') 

我找的輸出如下:

<SALE1> 
<FOR01>250000</FOR01> 
<FOR02>400000</FOR02> 
</SALE1> 
<SALE2> 
<FOR03>500000</FOR03> 
<FOR04>800000</FOR04> 
</SALE2> 

回答

0

這裏使用此查詢:

SELECT 
    p.PName '@Name', 
    (SELECT 
     c.CName AS '@Name', 
     (SELECT 
      cv.CValue AS 'Value' 
     FROM dbo.CHILDVALUE cv 
     WHERE cv.CID = c.CID 
     FOR XML PATH(''), TYPE 
     ) 
    FROM dbo.CHILD c 
    WHERE c.PID = p.PID 
    FOR XML PATH('Child'), TYPE 
    ) 
FROM  
    Parent p 
FOR 
    XML PATH('Node'), ROOT('Root') 

你可以得到如下結果:

<Root> 
    <Node Name="SALES1"> 
    <Child Name="FOR01"> 
     <Value>250000</Value> 
    </Child> 
    <Child Name="FOR02"> 
     <Value>400000</Value> 
    </Child> 
    </Node> 
    <Node Name="SALES2"> 
    <Child Name="FOR03"> 
     <Value>500000</Value> 
    </Child> 
    <Child Name="FOR04"> 
     <Value>800000</Value> 
    </Child> 
    </Node> 
</Root> 

這大概是接近你的要求,你可以用FOR XML PATH(), ROOT()

+0

感謝您的回覆。我也能夠得到像你一樣的東西,但我真的希望列名作爲元素。那麼,我所要求的FOR XML語法是不可能的?此外,我可以在存儲過程中操作表格,在內部使用一些臨時表格等,但仍不清楚我如何獲得所需結果。 – Raj73 2010-04-29 18:01:01

+0

@ Raj73:從我所瞭解的有關SQL Server及其FOR XML支持的所有信息中,您嘗試執行的操作都無法完成。如果您對獲得的結果不滿意,則必須使用一些編程語言,如C#或VB.NET或其他語言來讀取數據並呈現XML。 – 2010-04-29 18:17:20

+0

謝謝,我們將有一百萬行,我不想使用C#/ ado.net/linq來生成和渲染xml。我打算從命令行運行查詢/存儲過程並將結果輸出爲xml文件。也許使用編程語言是唯一可以完成的方法。 – Raj73 2010-04-29 18:23:36

0

節點對應字段名獲得。因此,如果您希望主節點都具有不同的名稱(即"<SALE1>", "<SALE2>"等),則它們不能來自同一列。

您要求的輸出格式將很難在以後查詢值。 (例如,它會阻止你告訴XPATH或你有什麼「看在」特定的「場」的值)

什麼,你應該尋找的是這樣的:

<SALE> 
    <ID>1</ID> 
    <FOR> 
     <ID>1</ID> 
     <NUM>250000</NUM> 
    </FOR> 
    <FOR> 
     <ID>2</ID> 
     <NUM>400000</NUM> 
    </FOR> 
</SALE> 
<SALE> 
    <ID>2</ID> 
    <FOR> 
     <ID>3</ID> 
     <NUM>500000</NUM> 
    </FOR> 
    <FOR> 
     <ID>4</ID> 
     <NUM>800000</NUM> 
    </FOR> 
</SALE> 

或者,屬性&元素像這樣的組合:

<SALE ID="1"> 
     <FOR ID="1"> 
      <NUM>250000</NUM> 
     </FOR> 
     <FOR ID="2"> 
      <NUM>400000</NUM> 
     </FOR> 
    </SALE> 
    <SALE ID="2"> 
     <FOR ID="3"> 
      <NUM>500000</NUM> 
     </FOR> 
     <FOR ID="4"> 
      <NUM>800000</NUM> 
     </FOR> 
    </SALE> 

不管怎樣,看看聯機叢書SQL-Server中。這裏有一些想法: FOR XML汽車,元素,根(「根」) FOR XML原料 等等

1

不明白爲什麼每個節點都需要一個不同的標籤 - 這不會有任何有趣的查詢 - 但無論如何,你可以明確地做到這一點(沒有FOR XML)。

通過遞增您的MIN(PID),並簡單地通過SELECT '<' + PNAME + '>'等等,對您的記錄集執行WHILE循環。對它進行格式化會非常棘手,因此它像默認的XML文件一樣是人類可讀的,但它仍然可以被任何網頁等讀取,您試圖查詢它。