c# - XML 文件到 SQL 附加插入

标签 c# sql-server t-sql

我有一个像这样的 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 表中找不到。

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

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

最佳答案

试试这个

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# - XML 文件到 SQL 附加插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16740237/

相关文章:

sql-server - 如何使用 TSQL 获取数据库中所有表的列表?

sql - 用于根据列类型插入默认值的存储过程

c# - "message": "The SSL connection could not be established, see inner exception." in Windows Server 2012 R2

c# - Expression.Reduce() 是做什么的?

c# - 如何使用 Windbg 从 .dmp 文件获取所有 System.String 的值

sql-server - 更新 View 不​​起作用

sql-server - SQL Server 中的证书过期后会发生什么?

c# - 如何从数据库中设置 radcombobox 选定值?

sql-server - SQL Server 存储过程 XML 无法正确获取节点

sql-server - 根据非 NULL 且早于行日期的最接近日期将值插入 NULL 行