1

我在 sql server 的 xml 列中有以下 xml,它与 id 列一起在一个表中 -

<ArrayOfExtVar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ExtVar>
    <Name xsi:type="xsd:string">Rate Code</Name>
    <Value xsi:type="xsd:string">E46</Value>
  </ExtVar>
  <ExtVar>
    <Name xsi:type="xsd:string">Middle Name</Name>
    <Value xsi:type="xsd:string">Henry</Value>
  </ExtVar>
</ArrayOfExtVar>

我有以下 XPath -

SELECT CustID, 
ExtVars.value('(/ArrayOfExtVar/ExtVar/Value)[1]', 'Nvarchar(max)') AS RateCode,
ExtVars.value('(/ArrayOfExtVar/ExtVar/Value)[2]', ''Nvarchar(max)') AS MiddleInitial 
FROM dbo.Customer

这很好,但我真正想做的是通过“名称”而不是索引([1])查询 xml,因为这些可能不时以不同的顺序存储。

基本上我需要知道的是如何通过“名称”的值进行查询,例如 -

'(/ArrayOfExtVar/ExtVar/Value)[Rate Code]'

我可以向 ExtVars 节点添加一个属性并对其进行查询吗?

4

4 回答 4

1

听起来你想要

/ArrayOfExtVar/ExtVar[Name = 'Rate Code']/Value
于 2013-01-28T12:52:16.647 回答
0

您也可以在谓词中执行轴步骤。

//ExtVar[Name eq 'Rate Code']/Value
于 2013-01-28T12:49:33.417 回答
0

我不知道 SQL Server 的 XPath 实现是否支持父 ( ..) 运算符,但您可以试试这个:

/ArrayOfExtVar/ExtVar/Name[text()='Rate Code']/../Value

这会找到Name内部文本为 的节点'Rate Code',然后导航到其父节点,然后从那里转到它Value下面的节点。


如果您可以添加Name作为ExtVar节点的属性,那会更容易一些:

示例 XML:

...
<ExtVar name="Rate Code">
    <Value xsi:type="xsd:string">E46</Value>
</ExtVar>
...

XPath:

/ArrayOfExtVar/ExtVar[@name='Rate Code']/Value
于 2013-01-28T12:44:42.540 回答
0

你是否试图做这样的事情:

DECLARE @input TABLE (ID INT, ExtVars XML)

INSERT INTO @input VALUES(1, '<ArrayOfExtVar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ExtVar>
    <Name xsi:type="xsd:string">Rate Code</Name>
    <Value xsi:type="xsd:string">E46</Value>
  </ExtVar>
  <ExtVar>
    <Name xsi:type="xsd:string">Middle Name</Name>
    <Value xsi:type="xsd:string">Henry</Value>
  </ExtVar>
</ArrayOfExtVar>')

SELECT
    Name = ExtVar.value('(Name)[1]', 'varchar(50)'),
    [Value] = ExtVar.value('(Value)[1]', 'varchar(50)')
FROM
    @input
CROSS APPLY
    ExtVars.nodes('/ArrayOfExtVar/ExtVar') AS XTbl(ExtVar)
WHERE   
    ID = 1

像这样返回输出:

在此处输入图像描述

当然,您也可以WHERE为此添加一个基于名称的子句(“到达”XML 以确定结果):

SELECT
    Name = ExtVar.value('(Name)[1]', 'varchar(50)'),
    [Value] = ExtVar.value('(Value)[1]', 'varchar(50)')
FROM
    @input
CROSS APPLY
    ExtVars.nodes('/ArrayOfExtVar/ExtVar') AS XTbl(ExtVar)
WHERE   
    ExtVar.value('(Name)[1]', 'varchar(50)') LIKE 'Rate%'   -- or whatever you want
于 2013-01-28T12:29:47.007 回答