我有一个包含记录的.Net DataTable,所有记录都被添加到#34;记录。数据库中的相应表可能包含数百万行。如果我试图简单地调用"更新"在我的SqlDataAdapter上的方法,任何现有的记录都会因为违反主键约束而引发异常。我考虑将所有物理表的记录加载到第二个DataTable实例中,合并这两个,然后在第二个DataTable上调用Update方法。这实际上就像我想要的那样。但是,我担心的是,如果物理表中有300亿条记录,那么将所有数据加载到内存中的DataTable可能是一个问题。
我考虑从物理表中选择一个数据子集并按上述方式进行,但是子查询的构造已经证明非常复杂且非常繁琐。你看,我没有使用一个已知的表。我正在使用包含数百个DataTable的DataSet。每个DataTable都映射到自己的物理表。表的名称和模式在编译时是未知的。这必须在运行时完成。
我玩过SqlBulkCopy类但有相同的问题 - 重复的记录会引发异常。
我不想在运行时为每个表动态构建查询。如果这是唯一的方式,那就这样吧,但我无法帮助,但我认为必须有一个使用Ado.Net提供的更简单的解决方案。
答案 0 :(得分:0)
您可以像这样创建insertcommand:
declare @pk int = 1
declare @txt nvarchar(100) = 'nothing'
insert into #temp (id, txt)
select distinct @pk, @txt
where not exists (select id from #temp x where x.id = @pk)
假设你的表#temp(本例中使用的临时表)是这样创建的(id为主键)
create table #temp (id int not null, txt nvarchar(100))