SET XACT_ABORT ON
insert tb1 value(..)
insert tb2 value(@@identity, ...)
SET XACT_ABORT OFF

解决方案 »

  1.   


    ---建立测试环境:create table tb1(userid int identity,name1 varchar(8),tel bigint) 
    create table tb2 (userid int ,name1 varchar(8),tel bigint)--创建存储过程
    create proc ins
    @name1 varchar(8),
    @tel bigint
    as 
    insert tb1 values(@name1,@tel)
    --select @@ident_current('tb1')
    insert tb2(userid) 
    select (select top 1 userid from tb1 order by userid desc)--执行存储过程
    exec ins '王红1',15564555
      

  2.   


    --也可以这样做
    create proc ins
    @name1 varchar(8),
    @tel bigint
    as 
    insert tb1 values(@name1,@tel)
    insert tb2(userid) 
    select (select ident_current('tb1'))
      

  3.   

    解释一下,
    ident_current('tb1'):ident_current('tablename')是个系统函数,
    其作用是将表中有标识列值的最后一次产生的标识值得到
      

  4.   

    create trigger tr_on_tb1
    on tb1
    for insert
    as
    insert tb2(userid) select userid from inserted
    if @@error<>0
    rollback tran
    go
      

  5.   

    select @userid=userid from tb1 .....
    这个是什么意思  写错了吧
      

  6.   

    楼上的兄弟,我的本意是从tb1中选择出刚生成的usrid
      

  7.   

    inserted逻辑表只记录刚插入的数据
      

  8.   

    如果用@@identity则只能插入一条记录,对于多条记录同时插入结果将会不正确。
      

  9.   

    存储过程中的语句是一起执行的吗,要么同时成功,要么同时失败,而不是一句一句执行?
    (不是,除非你加一事物控制,才會一起執行)
    所謂事物控制不一定是 begin tran  ....comit  ...
    假如你同時選中幾個語句---》事物樓主就是這種情況
      

  10.   

    insert tb1 value(..)
    insert tb2 value(@@scope_identity, ...)
      

  11.   

    insert tb1 value(..)
    select @userid=userid from tb1   ----這裡得到的@userid必須是唯一(
    ---比如 select @userid=max(id) from tb1
    insert tb2 value(@userid,....) ---此句必須判定 tb2的userid不能為identity
      

  12.   

    @@IDENTITY
    返回最后插入的标识值。--------------------
    select @@identity 就是你刚刚插入tb1中中刚生成的usrid的值,虽然@@identity 有些限制,但是已经满足你上面的要求了
      

  13.   

    如果要一起执行,写个事务来控制就行了!SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO
    create    PROCEDURE  dbo.proc_abc
                                   
    AS       set nocount on    BEGIN TRANSACTION 
                  
       insert tb1 value(..)
    select @userid=userid from tb1 .....       if @@error<>0
                        begin
                             ROLLBACK TRANSACTION
                             select -200,'insert error 1'
                             return
                        end
    insert tb2 value(@userid,....)     if @@error <>0
           begin        rollback tran
           select -300,'insert error 2'
           return
       end
                 COMMIT  TRANSACTION
                 select  999, '操作表成功'
                 return                   
    GO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO
      

  14.   

    谢谢大家,最后我用scope_indetity(),因它只返回局部的标识值,不会受其它因素的影响.当然用事务解决是最好不过的了,以后我会考虑这样作的。