2

我有一个像这样的 MSSQL 表:

id     | name
-----------------------------
1        Gerald
2        Ron
3        Becky

还有一个 XML 文档:

<People>
    <Person>
        <Name>Gerald</Name>
    </Person>
    <Person>
        <Name>Ron</Name>
    </Person>
    <Person>
        <Name>Becky</Name>
    </Person>
</People>

主键是 ID,XML 文档不关心 ID,Name 是唯一的。

XML 文档发生更改,我的应用程序应为<Person>SQL 表中未找到的任何行添加新行。

当然,我可以循环遍历整个 SQL 表,每次<Person>检查一行并在未找到时添加该行,但有更好的方法吗?

为了增加额外的复杂性,如果我<Person>在 XML 文件中更新 a 的名称,它需要更新该人之前在 SQL 表中所在的同一行。

4

2 回答 2

2

尝试这个

declare @data xml = '<People>
    <Person>
        <Name>Gerald</Name>
    </Person>
    <Person>
        <Name>Ron</Name>
    </Person>
    <Person>
        <Name>Becky</Name>
    </Person>
</People>'

--Convert xml to rows example:
SELECT N.value('.', 'varchar(50)') as value 
FROM @data.nodes('/People/Person/Name') as T(N)

-- use merge to find rows and insert when not found
Merge Table1 as tgt
using (
        SELECT N.value('.', 'varchar(50)') as Name 
        FROM @data.nodes('/People/Person/Name') as T(N)
      ) src
on (tgt.name = src.name)
when not matched then
insert (name)
values (src.name);

要更新行,您需要文件中的某种 id 来标识要更新的行

于 2013-05-24T17:17:48.720 回答
1

您可以向 中添加一个属性<Person>,这表明它已经在数据库中:

<People>
    <Person inserted="1">
        <Name>Gerald</Name>
    </Person>
    <Person inserted="1">
        <Name>Ron</Name>
    </Person>
    <Person inserted="0">
        <Name>Becky</Name>
   </Person>
</People>
于 2013-05-24T17:15:28.210 回答