[英]How to extract a list of values from a SQL XML column
Here is my XML:这是我的 XML:
<Triggers>
<Trigger>
<Name>DrugName</Name>
<Values>
<Value>Meclofenamate</Value>
<Value>Meloxicam</Value>
<Value>Vimovo</Value>
<Value>Nabumetone</Value>
<Value>Qmiiz</Value>
<Value>Tolmetin</Value>
</Values>
</Trigger>
<Trigger>
<Name>State</Name>
<Values>
<Value>MI</Value>
</Values>
</Trigger>
<Trigger>
<Name>BenefitType</Name>
<Values>
<Value>Pharmacy</Value>
</Values>
</Trigger>
<Trigger>
<Name>LineOfBusiness</Name>
<Values>
<Value>Medicaid</Value>
</Values>
</Trigger>
</Triggers>
My goal is to get output that looks like this:我的目标是让 output 看起来像这样:
ID DrugName State BenefitType LineOfBusiness
6500 Meclofenamate MI Pharmacy Medicaid
6501 Meloxicam MI Pharmacy Medicaid
6502 Vimovo MI Pharmacy Medicaid
6503 Nabumetone MI Pharmacy Medicaid
6504 Qmiiz MI Pharmacy Medicaid
6505 Tolmetin MI Pharmacy Medicaid
I can't find any examples on stackoverflow after extensive searches where XML is organized this way, and the examples I have found, tweaked and applied result in my getting a list of all the Values in one column (State values, BenefitType values, etc. mixed in with DrugName values).在广泛搜索 XML 以这种方式组织后,我在 stackoverflow 上找不到任何示例,而我发现、调整和应用的示例导致我在一列中获得所有值的列表(状态值、BenefitType 值等. 与 DrugName 值混合在一起)。
The ID column is not part of the XML, but I need to have that in my output. ID 列不是 XML 的一部分,但我需要在我的 output 中有它。
Here what the table looks like that has the XML column.这里的表格看起来像 XML 列。
You needs the .nodes
XML function to break out the Trigger nodes, then again for Values rows.您需要
.nodes
XML function 来断开触发节点,然后再断开值行。
To get the value of a node instead of it's name, we use text()
.要获取节点的值而不是其名称,我们使用
text()
。
To verify we are grabbing the right Trigger
node for each column, we use the []
predicate to check (a bit like a where
).为了验证我们是否为每一列抓取了正确的
Trigger
节点,我们使用[]
谓词进行检查(有点像where
)。
.value
requires a single value, so we use [1]
to get the first node. .value
需要单个值,因此我们使用[1]
来获取第一个节点。
SELECT
DrugName = drugs.DrugName.value('text()[1]','nvarchar(100)'),
State = tr.Trigg.value('Trigger[Name/text()="State"][1]/Values[1]/Value[1]/text()[1]', 'nvarchar(100)'),
BenefitType = tr.Trigg.value('Trigger[Name/text()="BenefitType"][1]/Values[1]/Value[1]/text()[1]', 'nvarchar(100)'),
LineOfBusiness = tr.Trigg.value('Trigger[Name/text()="LineOfBusiness"][1]/Values[1]/Value[1]/text()[1]', 'nvarchar(100)')
FROM @xml.nodes('/Triggers') tr(Trigg)
OUTER APPLY tr.Trigg.nodes('Trigger[Name/text()="DrugName"][1]/Values/Value') drugs(DrugName)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.