SQL Server查询xml列

时间:2015-06-18 20:21:20

标签: sql-server xml

我需要从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>值时遇到问题。

2 个答案:

答案 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