zoukankan      html  css  js  c++  java
  • [转载自键舞者]SELECT IDENT_CURRENT(tableName)获得自增长列ID的实现

    项目中要用到一个功 能:主表主键为自增长,要求在插入主表数据前先获得主表要插入数据的主键ID值,用在插入子表时获取主键ID。在网上搜了一下,发现SELECT IDENT_CURRENT(TableName)这个语句可以实现。可是后来发现这个语句存在一个致命问题。

    问题如下:(表中数据都 为空)

    (情况一)

    当新建表数据为空时, IDENT_CURRENT(TableName)返回值为1.这时主表数据插入成功后,主表自增长列会自动赋值 1

    (情况二)

    当新增一条数据并删除后, IDENT_CURRENT(TableName)返回值还是1,可是现在主表 插入成功后,主表自增长列会自动赋值2,而插入子表的主表ID还是1,这样就会导致主表和子表的关联字段不一致。

    在网上找了几个解决方案:

    1. DBCC CHECKIDENT (tableName, RESEED, 1)

    重 置表的标示种子为1,可是在‘情况二’下,数据库还是会以 2 赋给主表ID字段,而不是1

    2. DBCC CHECKIDENT (tableName)

    在”情况一”下输出为:

    检 查标识信息: 当前标识值'null',当前列值'null'。

    在”情况二”下输出为:

    检 查标识信息: 当前标识值'1',当前列值'1'。

    虽 然根据输出信息不同,当数据表空时可以判断是‘情况一’还是‘情况二’,可是在C#中无论用ExecuteNonQuery, ExecuteScalar还是datatable返回的都是空数据

    郁闷了一个下午始终没有找到答案,最后发现用下面的方法可以实现在子表中插入主表最新记录的ID值。 直接将“CONVERT(INT,IDENT_CURRENT('TableName'))”作为主键ID的值添加到子表sql语句即可

    如INSERT INTO PayInfo(SID) VALUES(CONVERT(INT,IDENT_CURRENT('TableName')))

  • 相关阅读:
    RE
    【LeetCode】198. House Robber
    【LeetCode】053. Maximum Subarray
    【LeetCode】152. Maximum Product Subarray
    【LeetCode】238.Product of Array Except Self
    【LeetCode】042 Trapping Rain Water
    【LeetCode】011 Container With Most Water
    【LeetCode】004. Median of Two Sorted Arrays
    【LeetCode】454 4Sum II
    【LeetCode】259 3Sum Smaller
  • 原文地址:https://www.cnblogs.com/lxzhangying/p/2198662.html
Copyright © 2011-2022 走看看