Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从表中的xml类型中进行选择?_Sql_Sql Server_Tsql_Xml Parsing - Fatal编程技术网

Sql 如何从表中的xml类型中进行选择?

Sql 如何从表中的xml类型中进行选择?,sql,sql-server,tsql,xml-parsing,Sql,Sql Server,Tsql,Xml Parsing,我可以得到我需要的值,如下所示: DECLARE @xml xml; SELECT TOP 1 @xml = InaSuQtyXml FROM csn_inventory..tblInventoryCache_st4 WHERE InaDateUpd > '2014-11-01' and InaQty > 0; SELECT b.value('@SuID', 'int') SuID, b.value('@Quantity', 'int') Quantity FROM @xml

我可以得到我需要的值,如下所示:

DECLARE @xml xml;
SELECT TOP 1  @xml = InaSuQtyXml 
FROM csn_inventory..tblInventoryCache_st4 
WHERE InaDateUpd > '2014-11-01' and InaQty > 0;

SELECT b.value('@SuID', 'int') SuID, b.value('@Quantity', 'int') Quantity
FROM @xml.nodes('/Inventory/Supplier') as a(b);`
它返回:

SuID | Quantity
-----+---------
 275 | 333
7417 | -1
15203| 48
但是,当我尝试执行同样的操作并按如下方式从表中提取更多信息时,会收到一条错误消息,指出
“节点”不是有效的函数、属性或字段。

SELECT
TOP 1
    InaPrSKU,
    InaDateUpd,
    (InaSuQtyXml).nodes('/Inventory/Supplier').value('@SuID', 'int') SuID,
    (InaSuQtyXml).nodes('/Inventory/Supplier').value('@Quantity', 'int') Quantity
FROM csn_inventory..tblInventoryCache_st4 
WHERE InaDateUpd > '2014-11-01' and InaQty > 0;
我希望这个查询会产生以下结果,但它似乎不起作用。有没有办法得到以下信息

InaPruSKU | InaDateUpd | SuID | Quantity
----------+------------+------+---------
  AA1433  | 2014-11-10 | 275  | 333
  AA1433  | 2014-11-10 | 7417 | -1
  AA1433  | 2014-11-10 | 15203| 48

您需要使用
交叉应用
,以从select中的节点函数中获取值。尝试这样更改您的查询

SELECT TOP 1 InaPrSKU,
             InaDateUpd,
             SuID = Container.value('(SuID)[1]', 'INT'),
             Quantity = Container.value('(Quantity)[1]', 'INT'),
FROM   csn_inventory..tblInventoryCache_st4
       CROSS apply InaSuQtyXml.nodes('/Root/Inventory/Supplier') AS T1 (Container)
WHERE  InaDateUpd > '2014-11-01'
       AND InaQty > 0; 
示例:

CREATE TABLE T
  (c3 XML)

INSERT INTO t
            (c3)
VALUES     ('<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>')

SELECT Warranty = Container.value('(Warranty)[1]', 'varchar(50)'),
       Maintenance = Container.value('(Maintenance)[1]', 'varchar(100)')
FROM   T
       CROSS apply c3.nodes('/Root/ProductDescription/Features') AS T1 (Container) 
创建表T
(c3xml)
插入t
(c3)
价值('
1年零件和劳动力
可提供3年零件和人工延长维护
')
选择Warranty=Container.value('(Warranty)[1],'varchar(50)'),
Maintenance=Container.value(‘(Maintenance)[1]’,‘varchar(100)’)
从T
交叉应用c3.nodes('/Root/ProductDescription/Features')作为T1(容器)

我认为这就是解决方案,只是以前从未使用过交叉应用。谢谢