C# XML文件到SQL附加插入

C# XML文件到SQL附加插入,c#,sql-server,tsql,C#,Sql Server,Tsql,我有这样一个MSSQL表: id | name ----------------------------- 1 Gerald 2 Ron 3 Becky 和XML文档: <People> <Person> <Name>Gerald</Name> </Person> <Person> <Name>Ron<

我有这样一个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,名称是唯一的

XML文档会发生更改,我的应用程序应该为SQL表中未找到的任何行向表中添加新行

当然,每次检查一行并添加未找到的行时,我都可以遍历整个SQL表,但是有更好的方法吗


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

您可以向添加一个属性,这表明该属性已在数据库中:

<People>
    <Person inserted="1">
        <Name>Gerald</Name>
    </Person>
    <Person inserted="1">
        <Name>Ron</Name>
    </Person>
    <Person inserted="0">
        <Name>Becky</Name>
   </Person>
</People>
试试这个

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来标识要更新的行

这是用什么语言完成的?c还是sql?读取XML文件的客户端应用程序是c,我使用MSSQL存储数据。因此,如果它是新的XML文档,请使用XML元素加载sql数据库,然后编写一个包含插入ID的新XML文档。在更新后的XML文档中,如果其中一个人发生了更改,则add changed=Yes并使用插入的ID仅导入这些人,然后编写一个没有更改属性的新XML文档。这样行吗?