如何从许多记录中获取xml?

时间:2012-10-09 19:59:34

标签: sql xml sql-server-2008 xquery

所以我有以下内容,允许我从Products表中的一条记录中获取xml。

但是,我需要能够从Products表中的所有记录及其ProductId中获取XML。

我对如何开始这个感到困惑。

DECLARE @MyXML XML
SET @MyXML =
    (SELECT ProductsXML
     FROM Products
     WHERE ProductId= 1)
SELECT 
    a.b.value('@upccode','int') as UPC,
    a.b.value('@dateadded','date') as DateAdded
FROM
    @MyXML.nodes('xml/Product/UPC')a(b);

我正在使用SQL Server 2008。

测试数据:

ProductId: 1
ProductsXML:
<xml>
        <Product>
            <UPC upccode="1237" dateadded="10/9/2012"/>
            <UPC upccode="1236" dateadded="10/8/2012"/>
            <UPC upccode="1235" dateadded="10/7/2012"/>
            <UPC upccode="1234" dateadded="10/6/2012"/>
        </Product>
    </xml>

ProductId: 2
ProductsXML:
<xml>
        <Product>
            <UPC upccode="9876" dateadded="9/9/2012"/>
            <UPC upccode="9877" dateadded="9/8/2012"/>
            <UPC upccode="0998" dateadded="9/7/2012"/>
            <UPC upccode="7877" dateadded="9/6/2012"/>
        </Product>
    </xml>

我正在寻找的结果是这样的:

ProductId      UPC        DateAdded
---------      ---        ---------
1              1237       10/9/2012
1              1236       10/8/2012
....
2              9876       9/9/2012
2              9877       9/8/2012

现在我可以通过一次指定一个PoductId来获得上述内容。我希望能够在不指定每个条目的情况下运行所有​​“产品”。

2 个答案:

答案 0 :(得分:1)

我猜你正在寻找这样的东西。

SELECT ProductId,
    a.b.value('@upccode','int') as UPC,
    a.b.value('@dateadded','date') as DateAdded
FROM Products
  CROSS APPLY ProductsXML.nodes('xml/Product/UPC')a(b);

不需要在那里有XML变量。直接查询Products表并对CROSS APPLY字段使用ProductsXML来粉碎XML。

答案 1 :(得分:0)

hi u can try using Linq to xml to create an entity from the xml, see the sample code below


XDocument somedoc = XDocument.Load("your xml path");


var somelist = from somevariable in somedoc.Descendants("Product")
               select new Product {
                                    UPC = somevariable.Attribute("upccode").value
                                    DateAdded = somevariable.Attribute("dateadded").value
                                  }

so now somelist is  a collection thru which u can iterate and add to List<Product>, create product b4 u start tryinh this