Итак, у меня есть следующие два тестовых/примерных запроса для INSERT и UPDATE данных из XML в таблицу SQL 2008. Довольно простой материал, заключающийся в том, что входящая структура XML будет сопоставлена со структурой таблицы SQL (ну, обновление, конечно, имеет только необходимые поля - опять же просто пример).
ВСТАВИТЬ ЗАЯВЛЕНИЕ
declare @passedXML xml
set @passedXML='<root><record><name>Sam</name><age>37</age><comments /></record><record><name>Dan</name><age>32</age><comments /></record></root>'
insert into test (name, age, comments)
select x.record.query('name').value('.', 'varchar(255)'),
x.record.query('age').value('.', 'int'),
x.record.query('comments').value('.','varchar(255)')
from @passedXML.nodes('root/record') as x(record)
Итак, проблем нет, две XML-записи вставляются по мере необходимости. Теперь переходим к оператору UPDATE:
ЗАЯВЛЕНИЕ ОБ ОБНОВЛЕНИИ
declare @passedXML xml
set @passedXML='<root><record><id>3</id><comments>This is a new comment</comments></record><record><id>2</id><comments>Michael Michael</comments></record></root>'
update test
set comments = (select x.record.query('comments').value('.','varchar(255)')
from @passedXML.nodes('root/record') as x(record)
where id = x.record.query('id').value('.','bigint'))
Итак, обновление работает — поле комментариев двух XML-записей обновляется на основе переданного
МОЙ ВОПРОС
Конечно, учитывая приведенный выше пример UPDATE, предложение where взято из XML, а не из таблицы TEST.. поэтому, когда UPDATE выполняется, запрос говорит, что 100 (если сказать, что это количество записей в таблице TEST) обновлено. конечно, были обновлены только две (в данном случае) записи, но SQL должен был пройти через всю таблицу?? Я думаю, есть ли способ каким-то образом прикрепить предложение where из XML к базовой таблице TEST, если это имеет смысл? то есть ограничить TEST только обновленными элементами?