好的,所以我有以下两个测试/示例查询来将 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 必须运行整个表??如果有意义的话,我想有没有办法以某种方式将 XML 中的 where 子句附加到底层 TEST 表?即限制测试只更新项目?