就是在SQL Server的一张表中插入一条数据,怎样获得当前数据的ID?  用Max(id)的方法是有缺点的,比如当前 最大为23,我插入24 25 后又删除了,那么再插入数据他的ID就是26而不再是24了,如果使用Max然后再加一,得到的结果将是24而不会 26  由于插入的数据而要用到当前的ID,所以以不能先插入再查询…… 哎,难呢……  
  如果新建一个虚拟表,然后插入一条数据,之后Max?

解决方案 »

  1.   

    access 里可以用 Select @@identity, 获取新增的自动编号值,sql server 应该有类似的方法,查一下联机帮助的变量列表
      

  2.   

    我是这么做的  select top 1 id+1 from [table] order by desc
      

  3.   

    汗,刚才那句少了一个 ^-^
      select top 1 id+1 from [table] order by id desc
      

  4.   

    直接用@@identity不就行了吗?LZ,这可不是很难的问题哦...看看联机丛书吧..
      

  5.   

    楼上正确.这个@@identity正是刚插入的数据的id号........
      

  6.   

    不是这样的,使用@@identity是在插入数据之后才返回新的ID,因为我要在插入数据之前就能获得这条数据的ID……
      

  7.   

    用Max(id)的方法是有缺点的,比如当前 最大为23,我插入24 25 后又删除了,那么再插入数据他的ID就是26而不再是24了,如果使用Max然后再加一,得到的结果将是24而不会 26这样做有什么不好的后果吗,如果没有就没什么。实在不行自己建个ID的序列表
      

  8.   

    不是不好,因为要插入的数据是和该条数据在数据库中的ID相关的,如果实际ID为26而使用Max(ID)+1计算出来的ID可能会是24,这样间就问题了
      

  9.   

    哎  新建了一个新表记录每个表的ID,当原表执行一个Insert后新表就自动增加1,这样做感觉不太好,但是如果有多张表都用得到话也是可以的似乎~
      

  10.   

    我的思路:
    先插入一条记录(什么都行),然后Select @@identity,再把这条记录给UPDATE成你想插入的记录就行了.
      

  11.   

    SQL中用存储过程
    @ID int output
    as
    insert into xx(x1,x20 values(x1,x2)
    set @ID=@@identity
    access中用
    Rs.Open "select * from xx where ID is null",conn,1,3
    rs.addnew()
    Rs("x1")=x1
    Rs("x2")=x2
    Rs.update
    ID=Rs("ID")
      

  12.   

    在数据库里多建一张表用来存储所有自动增长列ID。
    例如表table
    字段:id,tableid,tablename,tableischangle//判断是否修改。
    每次写入数据的时候,都从该表中读取对应的ID值,然后检查tableischangle的值。就可以了
      

  13.   

    create proc Addxxxx
    (@getid int OUTPUT,
     @name varchar(20),
     @info varchar(100)
    )asinsert into Table1(xName, xInfo) Values(@name, @info)set @getid = SCOPE_IDENTITY()
      

  14.   

    SCOPE_IDENTITY() 取得表中最新的标识列的值,你的表的ID必须是标识列
      

  15.   

    用一个表来存储当前的序号(SequenceType,SequenceID)
    每次用存储过程去获取SequenceID时,在rowlock可以解决并发和返回自增长的ID问题
      

  16.   

    流水号----例如我的customers表里有个customerid,因为我的格式特殊‘年月日 + 7位流水号’,所以当时我必须自行找到当前最大流水号,再加1,即为所需。
    ---------以下是我存储过程的一部分-----declare @CustomerID nvarchar(20),@temp int
    set @temp = (select count(*) from customers)
    if(@temp=0)
    set @CustomerID=convert(nvarchar(20),getdate(),112) + '0000001'  --格式例如 200604010000001
    else
    set @CustomerID=convert(nvarchar(20),getdate(),112) + substring((select CAST(CAST(max([CustomerID]) as bigint)+1 as nvarchar(20))from customers),9,7)
    ---------------------------------------------==== 
    ~~~~ 我的Blog:http://blog.csdn.net/quou2002 
      

  17.   

    Select @@identity
    就可以了
      

  18.   

    由于插入的数据而要用到当前的ID,所以以不能先插入再查询…… 自增型的ID,插入的时候是不要用到的,你完全可以先插入再查询,虽然这样效率不一定高
      

  19.   

    提前知道ID不是好办法,除非是单线程、单连接的、应用程序端可以完全控制的
    ID应该在服务器端,线程安全的情况下产生,然后返回给应用程序端