Получить XML, содержащий @, используя запрос SQL Server - PullRequest
0 голосов
/ 09 июля 2019

У меня есть таблица с именем Announcement со столбцом XML с именем XMLData.

Используя запрос SQL Server, я пытаюсь получить значения Currency и PriceValue.

Пример XML:

<AmtPrice> 
    <PricValue Currency="USD">2.33</PricValue>
</AmtPrice>

Мой запрос:

select Announcement.XMLData.value('(/AmtPrice/PricValue[@Currency="USD"]/node())[1]', 'nvarchar(max)') As PriceValue

Получите PriceValue, используя приведенный выше запрос. Моя проблема в том, как получить Currency значение?

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Ваш запрос допускает несколько PricValue узлов и выбирает первый, который имеет валюту USD. Если вы знаете, что у вас есть только один PricValue узел или если вы хотите выбрать первые PricValue узлы (независимо от валюты), вы можете использовать что-то вроде этого:

SELECT XMLData.value('(/AmtPrice/PricValue)[1]', 'NUMERIC(10,2)') As PriceValue,
       XMLData.value('(/AmtPrice/PricValue/@Currency)[1]', 'CHAR(3)') As Currency
FROM Announcement

Я использовал определенные типы данных вместо nvarchar(max) для повышения производительности. Если цена не числовая или больше, чем соответствует NUMERIC(10),2, вы получите ошибку. Если в нем больше десятичных знаков, они будут округлены. Если валюта длиннее 3 символов, она будет молча усечена.

0 голосов
/ 09 июля 2019

Вы можете попробовать это:

SELECT 
    Announcement.XMLData.value('(/AmtPrice/PricValue/@Currency)[1]', 'VARCHAR(10)') As Currency,
    Announcement.XMLData.value('(/AmtPrice/PricValue[@Currency="USD"])[1]', 'DECIMAL(18,2)') As PriceValue

Указывая @Currency в XPath, вы считываете значение атрибута Currency атрибута.

Я бы также настоятельно рекомендовал использовать наиболее подходящий тип данных при преобразовании значений - и использование NVARCHAR(MAX) для значения 2.33 не кажется очень подходящим - вместо этого используйте тип DECIMAL(p,s).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...