sql - 具有异步结构的openxml

标签 sql sql-server xml

我正在使用 MS SQL Server 2012。

我尝试将函数 openxml 与以下语句/xml 数据一起使用:

DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)

SET @SQL = '<master>
  <List>
    <Col>
      <DisplayFieldName>Peter</DisplayFieldName>
      <Value>
        <string>Yes</string>
      </Value>
    </Col>
    <Col>
      <DisplayFieldName>Tom</DisplayFieldName>
      <Value>
        <string>No</string>
      </Value> 
    </Col>
    <Col>
      <DisplayFieldName>Numerics</DisplayFieldName>     
      <Value>
        <string>50          </string>
        <string>100          </string>
        <string>150          </string>
        <string>200          </string> 
      </Value>
    </Col>
  </List>
</master>'


SELECT @XML = CONVERT(XML,@SQL)

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML

SELECT *
FROM OPENXML(@hDoc, '/master/List/Col/Value',3)  
WITH 
(
string [varchar](max)
)

EXEC sp_xml_removedocument @hDoc

结果是这样的:

  string
1 Yes
2 No
3 50

我明白为什么会发生这种情况,但实际上我只想显示所有数值(50,100,150,200)或至少显示该字段中的所有值(是、否、50、100、150、200),这也足够了。

最佳答案

FROM OPENXML 已过时,不应再使用(有一些罕见的异常(exception)...)

您应该使用 XML 方法,例如 .value().nodes().query().exist().

尝试一下:它是完全内联的(临时),更易于阅读和维护 - 而且速度更快:

DECLARE @XML AS XML;

SET @XML = '<master>
  <List>
    <Col>
      <DisplayFieldName>Peter</DisplayFieldName>
      <Value>
        <string>Yes</string>
      </Value>
    </Col>
    <Col>
      <DisplayFieldName>Tom</DisplayFieldName>
      <Value>
        <string>No</string>
      </Value> 
    </Col>
    <Col>
      <DisplayFieldName>Numerics</DisplayFieldName>     
      <Value>
        <string>50          </string>
        <string>100          </string>
        <string>150          </string>
        <string>200          </string> 
      </Value>
    </Col>
  </List>
</master>';

SELECT C.value('DisplayFieldName[1]','nvarchar(max)') AS DisplayFieldName
      ,V.value('.','nvarchar(max)') AS string

FROM @XML.nodes('/master/List/Col') AS A(C)
CROSS APPLY C.nodes('Value/string') AS B(V);

结果

DisplayFieldName    string
----------------------------
Peter               Yes
Tom                 No
Numerics            50          
Numerics            100          
Numerics            150          
Numerics            200     

更新

如果您只需要数字,您可以将相同的 XQuery 过滤器附加到 .nodes() XPath,如 Alex 所指出的:/master/List/Col[DisplayFieldName= “数字”]

关于sql - 具有异步结构的openxml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38729583/

相关文章:

MySQL:从 double 转换为十进制时精度损失

mysql - MySQL中样本之间的划分

sql-server - 对所有值进行分组和乘法?

sql - :SQL: select values from rows as columns

sql-server - 无法访问从代码创建的临时表

java - XPATH + 在 java 中解析 XML + 需要检查属性以访问下一个同级值

mysql - 返回状态为已交付的订单的产品总数量的 SQL(不同的两个表)

带有 'select where x is not null' 的 SQL Server View 需要很长时间才能完成

Python 在没有第三方库的情况下操作和保存 XML

java - Netty 抛出 IndexOutOfBoundsException