Sql server SQL Server替代重新设置标识列种子

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),我将其加载到数据表

我目前正在开发一个电话簿应用程序。对于这个应用程序,我从公司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版本是什么?