我需要从XML列中提取值。该表包含3个字段,其中一个是XML列,如下所示:
TransID int, 放置varchar(20), 自定义XML
XML列的结构如下:
<Fields>
<Field>
<Id>9346-00155D1C204E</Id>
<TransactionCode>0710</TransactionCode>
<Amount>5.0000</Amount>
</Field>
<Field>
<Id>A6F0-BA07EF3A7D43</Id>
<TransactionCode>0885</TransactionCode>
<Amount>57.9000</Amount>
</Field>
<Field>
<Id>9BDA-7858FD182Z3C</Id>
<TransactionCode>0935</TransactionCode>
<Amount>25.85000</Amount>
</Field>
</Fields>
如果有<Amount>
= 0935,我需要能够查询xml列并仅返回<Transaction code>
的值。注意:此记录中不存在此事务代码,但它不会在同一记录中存在两次。
这可能很简单,但我只是在返回<amount>
= 0935的<transaction code>
值时遇到问题。
答案 0 :(得分:0)
您可以在TSQL中使用XPath
这样的内容:
SELECT
*,
Custom.value('(/Fields/Field[@Name="Id"]/@Value)[1]', 'varchar(50)')
FROM YourTable
WHERE Custom.value('(/Fields/Field[@Name="Id"]/@Value)[1]', 'varchar(50)') = '0655'
答案 1 :(得分:0)
您可以尝试这种方式:
DECLARE @transCode VARCHAR(10) = '0935'
SELECT field.value('Amount[1]', 'decimal(18,5)') as Amount
FROM yourTable t
OUTER APPLY t.Custom.nodes('/Fields/Field[TransactionCode=sql:variable("@transCode)"]') as x(field)
或者,您可以在SQL Field
子句中使用TransactionCode
而不是在XPath表达式中放置用于过滤WHERE
的逻辑,如下所示:
DECLARE @transCode VARCHAR(10) = '0935'
SELECT field.value('Amount[1]', 'decimal(18,5)') as Amount
FROM yourTable t
OUTER APPLY t.Custom.nodes('/Fields/Field') as x(field)
WHERE field.value('TransactionCode[1]', 'varchar(10)') = @transCode
<强> SQL Fiddle Demo
强>