2015-06-18 4 views
2

Мне нужно вытащить значения из столбца XML. Таблица содержит 3 поля при этом один столбец XML, как показано ниже:SQL Server query xml column

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> 

Мне нужно иметь возможность запросить столбец xml и вернуть только значение для <Amount>, если есть <Transaction code> = 0935. Примечание: есть записи, где этот код транзакции отсутствует, но он не будет существовать в такая же запись дважды.

Это, вероятно, просто, но у меня возникают проблемы, возвращающегося только значение <amount> где <transaction code> = 0935.

+0

«XML колонке. В таблице содержится 3 поля: «Мне очень жаль, но я не мог получить ур. Помогите мне. – Bikku

ответ

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) 

в качестве альтернативы, вы можете поставить логику для фильтрации Field по TransactionCode в SQL WHERE пункт вместо в выражении XPath, например, так:

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

0

Вы можете использовать XPath как это в TSQL:

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'