2010-04-21 116 views
0

This site有技術,在Microsoft SQL Server來回傳遞XML數據:Microsoft SQL Server的XML數據

DECLARE @productIds xml 
SET @productIds ='<Products><id>3</id><id>6</id><id>15</id></Products>' 

SELECT 
ParamValues.ID.value('.','VARCHAR(20)') 
FROM @productIds.nodes('/Products/id') as ParamValues(ID) 

但是,什麼是語法,如果我添加一個字段? 下不起作用:

DECLARE @productIds xml 
SET @productIds ='<Products><id>3</id><descr>Three</descr><id>6</id><descr>six</descr><id>15</id><descr>Fifteen</descr></Products>' 

SELECT 
ParamValues.ID.value('.','VARCHAR(20)') 
,ParamValues.descr.value('.','VARCHAR(20)') 
FROM @productIds.nodes('/Products/id') as ParamValues(ID) 

注:也許我已經構造我的XML錯誤。

回答

3

你需要使用類似:

SELECT 
    ParamValues.ID.value('(id)[1]','VARCHAR(20)'), 
    ParamValues.ID.value('(descr)[1]','VARCHAR(20)') 
FROM 
    @productIds.nodes('/Products') as ParamValues(ID) 

,從聲明中有定義一樣叫ParamValues.ID一個「虛擬表」的東西 - 你需要選擇<Products>節點到該虛擬表,然後進入裏面的屬性它。

而且,你的XML結構很不好選擇:

<Products> 
    <id>3</id> 
    <descr>Three</descr> 
    <id>6</id> 
    <descr>six</descr> 
    <id>15</id> 
    <descr>Fifteen</descr> 
</Products> 

你將無法選擇ID/DESCR的個體對 - 你應該更多的使用類似:

<Products> 
    <Product> 
     <id>3</id> 
     <descr>Three</descr> 
    </Product> 
    <Product> 
     <id>6</id> 
     <descr>six</descr> 
    </Product> 
    <Product> 
     <id>15</id> 
     <descr>Fifteen</descr> 
    </Product> 
</Products> 

然後您可以使用此SQL XML查詢檢索所有項目:

SELECT 
    ParamValues.ID.value('(id)[1]','VARCHAR(20)') AS 'ID', 
    ParamValues.ID.value('(descr)[1]','VARCHAR(20)') AS 'Description' 
FROM 
    @productIds.nodes('/Products/Product') as ParamValues(ID) 

ID Descrition 
3  Three 
6  six 
15  Fifteen 
1

您必須將每組iddescr合併成一個父節點。說。現在你可以像這樣訪問每一對。

DECLARE @productIds xml 
SET @productIds ='<Products><Row><id>3</id><descr>Three</descr></Row><Row><id>6</id><descr>six</descr></Row><Row><id>15</id><descr>Fifteen</descr></Row></Products>' 

SELECT 
ParamValues.Row.query('id').value('.','VARCHAR(20)'), 
ParamValues.Row.query('descr').value('.','VARCHAR(20)') 
FROM @productIds.nodes('/Products/Row') as ParamValues(Row)