1

好的,所以我有以下两个测试/示例查询来将 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 表?即限制测试只更新项目?

4

1 回答 1

2

让我改变一下你的更新查询:

  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>'

DECLARe @test TABLE (id bigint IDENTITY(1,1),name nvarchar(100), age int, comments varchar(255))
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)


set @passedXML='<root><record><id>99999</id><comments>This is a new comment</comments></record><record><id>2</id><comments>Michael Michael</comments></record></root>'
; with CTE as( 
SELECT  x.record.query('comments').value('.','varchar(255)') comment,
        x.record.query('id').value('.','int') id
    from @passedXML.nodes('root/record') as x(record))
update @test
set comments = cte.comment
FROM @test T
JOIN CTE oN cte.id=t.id

更新结果:(1 row(s) affected)

SQL 服务器足够聪明,不会更新每一行。如果查看执行计划,您会发现哈希匹配只有一个实际行数,而不是两个:

在此处输入图像描述

@@RoWCOUNT 也会向您显示 1,这没关系。

在您的示例中,您已经更新了每一行(如果在 XML 中没有这样的 id,则应在注释中插入 NULL)

于 2011-06-28T07:57:23.880 回答