2010-04-21 80 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)