SQL Server替代重新标记标识列

时间:2014-11-17 08:07:25

标签: sql-server database sql-server-2012 sqlbulkcopy

我目前正在开发电话目录应用程序。对于这个应用程序,我从公司SAP获得一个平面文件(csv),每天更新一次,我用它来使用Windows服务每天更新一次sql数据库。此外,如果用户不存在,用户可以将自己添加到数据库中(即:不包括在SAP文件中)。因此,联系人可以有两种不同的类型:'SAP'或'ECOM'。

因此,Windows服务从SAP ftp下载文件,删除“SAP”类型的数据库中的所有现有联系人,然后将文件中的所有联系人添加到数据库。要将联系人插入数据库(大约30k),我将它们加载到DataTable然后使用SqlBulkCopy。这特别有效,只运行几秒钟。

唯一的问题是此表的主键是自动递增的标识。这意味着我的联系人ID以每天6万的速度增长。我还在开发中,我的身份在20mil的范围内:

http://localhost/CityPhone/Contact/Details/21026374

我开始研究重新种植id列,但是如果我将身份重新设置为数据库中当前最高的数字,则以下情况会产生问题:

  1. Windows服务加载30 000个联系人
  2. 用户为自己创建条目(id = 30 001)
  3. Windows服务会删除所有SAP联系人,将列重新设置为当前最高ID:30 002
  4. 另外,我经常根据这个id查询用户,所以,我担心使用像GUID而不是自动递增的整数这样的东西会有太高的性价比。我也试过调查SqlBulkCopyOptions.KeepIdentity,但这不起作用。我没有在文件中获得SAP的任何ID,如果我这样做,他们很容易与手动输入的联系人字段的值冲突。是否有任何其他解决方案来重新安排不会导致id列值以这种指数速率增长的列?

2 个答案:

答案 0 :(得分:1)

我建议遵循以下工作流程。

  1. 使用您当前的工作流程导入到全新的表格,例如tempSAPImport。
  2. 仅向表中添加已更改的行。

    Insert Into ContactDetails 
       (Select * 
        from tempSAPImport 
        EXCEPT 
        SELECT Detail1, Detail2 
        FROM ContactDetails)
    
  3. 我认为您的SAP表有一个主键,如果只更新了行,您可以使用该控件。

    Update ContactDetails ( XXX your update criteria)
    
  4. 这样您就可以快速导入数据,也可以保留现有的身份值。根据您的速度要求,导入后添加索引将加快您的流程。

答案 1 :(得分:1)

如果SQL Server版本> = 2012,那么我认为上述场景的最佳解决方案是使用PK值的序列。通过这种方式,您可以控制播种过程(可以循环使用值)。

此处有更多详情:http://msdn.microsoft.com/en-us/library/ff878091(v=sql.110).aspx