Sql server SQL Server替代重新设置标识列种子
我目前正在开发一个电话簿应用程序。对于这个应用程序,我从公司SAP获得一个平面文件(csv),该文件每天更新一次,我使用它使用windows服务每天更新两次sql数据库。此外,如果不存在,用户可以将自己添加到数据库中(即:不包含在SAP文件中)。因此,联系人可以是两种不同的类型:“SAP”或“ECOM” 因此,Windows服务从SAP ftp下载该文件,删除“SAP”类型数据库中的所有现有联系人,然后将该文件中的所有联系人添加到数据库中。为了将联系人插入数据库(大约30k),我将其加载到Sql server SQL Server替代重新设置标识列种子,sql-server,database,sql-server-2012,sqlbulkcopy,Sql Server,Database,Sql Server 2012,Sqlbulkcopy,我目前正在开发一个电话簿应用程序。对于这个应用程序,我从公司SAP获得一个平面文件(csv),该文件每天更新一次,我使用它使用windows服务每天更新两次sql数据库。此外,如果不存在,用户可以将自己添加到数据库中(即:不包含在SAP文件中)。因此,联系人可以是两种不同的类型:“SAP”或“ECOM” 因此,Windows服务从SAP ftp下载该文件,删除“SAP”类型数据库中的所有现有联系人,然后将该文件中的所有联系人添加到数据库中。为了将联系人插入数据库(大约30k),我将其加载到数据表
数据表中,然后使用SqlBulkCopy。这种方法特别有效,只需运行几秒钟
唯一的问题是这个表的主键是一个自动递增的标识。这意味着我的联系人id以每天60k的速度增长。我仍在开发中,我的id在2000英里的范围内:
http://localhost/CityPhone/Contact/Details/21026374
我开始考虑重新设置id列的种子,但如果我要将标识重新设置为数据库中当前的最高编号,则以下场景会带来问题:
Windows服务可加载30000个联系人
用户为自己创建条目(id=30 001)
Windows服务删除所有SAP联系人,并在当前最高id:30 002之后将列重新设定为
此外,我经常根据这个id查询用户,因此,我担心使用GUID之类的东西而不是自动递增的整数会带来太高的性能代价。我还尝试了查看SqlBulkCopyOptions.KeepIdentity
,但这不起作用。我没有从文件中的SAP获取任何id,如果我获取了,它们很容易与手动输入的联系人字段的值冲突。是否有其他解决方案可以重新设置列的种子,而不会导致id列的值以这样的指数速度增长?我建议执行以下工作流
使用当前工作流导入到全新的表,如tempSAPImport
仅将更改的行添加到表中
Insert Into ContactDetails
(Select *
from tempSAPImport
EXCEPT
SELECT Detail1, Detail2
FROM ContactDetails)
我认为您的SAP表有一个主键,如果只更新一行,您可以使用该控件
Update ContactDetails ( XXX your update criteria)
通过这种方式,您可以快速导入数据,还可以保留现有的标识值。根据您的速度要求,在导入后添加索引将加快您的过程。如果SQL Server版本>=2012,则我认为上述场景的最佳解决方案是使用PK值序列。通过这种方式,您可以控制播种过程(可以循环值)
此处有更多详细信息:是否需要删除和插入?您不能更新现有记录并插入新记录吗?@SameerAzazi:我删除然后插入联系人的原因是目录应始终与SAP同步。这意味着,如果他们在文件中不再有联系人,则他/她不应再在数据库中。这是最简单的方法。正如我们在这里讨论的一样,本例中的核心问题是处理表的方法完全失败。无需删除然后插入。@Carel,您在dev/prod环境中使用的SQL Server版本是什么?