2012-06-25 3 views
1

У меня есть таблица со столбцом типа XML (имя столбца До) здесь образец данныхизвлечения данных из столбца XML SQL

<row ID="47" By="Test User" Date="2006-07-26T00:00:00" Status="Closed" 
    Closed_Date="2012-06-22T11:14:35.237" Closed_By="MrBig" /> 

Когда я использую этот запрос, чтобы retrive данные, я получить нули вместо идентификационных номеров

SELECT before.value('ID[1]', 'int') ItemId 
FROM dbo.Audit 
CROSS APPLY Before.nodes('.') N(C) 

Где я иду не так?

ответ

0

Вы должны изменить его к этому:

SELECT before.value('@ID[1]', 'int') ItemId 
FROM @Audit 
CROSS APPLY Before.nodes('/row') N(C) 

.nodes('/row') Используйте, чтобы выбрать <row> узел - и использовать @ID для выбора атрибута XML.

Однако, используя это, вы получите сообщение об ошибке:

Msg 2390, Level 16, State 1, Line 6
XQuery [@Audit.before.value()]: Top-level attribute nodes are not supported

Поскольку у вас есть только один <row> элемент в вашем XML (? Это правильно, справа), вы можете использовать вместо этого:

SELECT 
    before.value('(row/@ID)[1]', 'int') ItemId 
FROM dbo.Audit 
+1

You Sir Marc_S мой герой. Иногда это требует еще нескольких глаз. Особенно при кодировании XML-запросов в 3-х часовом формате PST. – TallKewlOnez

1

Это атрибут, поэтому вы должны указать его @, например @ID. Атрибут всегда должен иметь префикс узла, поэтому запрос XPath становится /row/@ID. Например:

SELECT Before.value('(/row/@ID)[1]', 'int') ItemId 
FROM Audit 

Насколько я могу видеть, что нет никакой необходимости в cross apply здесь.

Live example at SQL Fiddle.

Смежные вопросы