有一表A  字段 id,name
id是GUID 是系统NewId 自动生成的,name是 varchar(50)
当插入A表的数据后,如何得到刚插入的Id的GUID的值

解决方案 »

  1.   

    用触发器吧,把数据放到某个变量或表中.
    大致方法如下:
    临时表为tb(myGUID)
    create trigger my_trig on A for insert
    as
      insert into tb select GUID from inserted
    go
      

  2.   


    参考老大的3、标识列或计算列方面的应用 
        对于标识列我们可能通过@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 几个相似的函数获得,他们都返回插入到表的 IDENTITY 列的最后一个值(本身这几个函数还是有差异的,主要是它们的作用域,请查联机帮助)。我们注意到它们只是返回最后一个值,对于批量时就无能无力了。对于实时并发多的系统时我们可以利用OUTPUT_CLAUSE语句把标识列的值提取出来。 
         
    ------------------------------------ 
    -- Author:  happyflsytone   
    -- Date:2008-10-02 16:39:39 
    ------------------------------------ 
    CREATE TABLE ScrapReason(scrapreasonid INT IDENTITY,[name] VARCHAR(50),modifieddate DATETIME) 

    --接受标识列值的表变量 
    DECLARE @MyTableVar TABLE( ScrapReasonID SMALLINT, 
                               Name VARCHAR(50), 
                               ModifiedDate DATETIME); 
    --模拟插入数据 
    INSERT ScrapReason 
        OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate 
            INTO @MyTableVar 
    SELECT N'Operator IDENTITY', GETDATE() 
    FROM sys.objects ; --查看记录的标识列数据 
    SELECT ScrapReasonID, Name, ModifiedDate FROM @MyTableVar; GO 
    drop table ScrapReason; 
    /* 
    ScrapReasonID Name                                               ModifiedDate 
    ------------- -------------------------------------------------- ----------------------- 
    1             Operator IDENTITY                                  2008-10-02 17:42:19.000 
    2             Operator IDENTITY                                  2008-10-02 17:42:19.000 
    3             Operator IDENTITY                                  2008-10-02 17:42:19.000 
    4             Operator IDENTITY                                  2008-10-02 17:42:19.000 
    5             Operator IDENTITY                                  2008-10-02 17:42:19.000 
    6             Operator IDENTITY                                  2008-10-02 17:42:19.000 
    ..... 
    ..... 
    62            Operator IDENTITY                                  2008-10-02 17:42:19.000 
    63            Operator IDENTITY                                  2008-10-02 17:42:19.000 (63 行受影响) */      
        下面我们再来看看触发器使用OUTPUT_CLAUSE的情况, 
         
    ------------------------------------ 
    -- Author:  happyflsytone   
    -- Date:2008-10-02 16:39:39 
    ------------------------------------ 
    CREATE TABLE TA( 
      scrapreasonid INT IDENTITY PRIMARY KEY, 
      [name] VARCHAR(50), 
      modifieddate DATETIME 


    CREATE TABLE TB( 
      ID INT REFERENCES TA(SCRAPREASONID), 
      [name] VARCHAR(50), 
      MODIFIEDDATE DATETIME 
    ); 
    GO 
    CREATE TRIGGER TR_INSERT 
    ON TA 
    INSTEAD OF INSERT 
    AS 
    BEGIN 
        --接受标识列值的表变量 
        DECLARE @MyTableVar TABLE( ID INT, 
                                   [NAME] VARCHAR(10), 
                                   ModifiedDate DATETIME); 
        INSERT TA 
            OUTPUT INSERTED.scrapreasonid,INSERTED.[NAME],INSERTED.ModifiedDate 
                INTO @MyTableVar 
        SELECT [name],modifieddate FROM INSERTED 
        INSERT INTO TB SELECT * FROM @MyTableVar 
    END 
    GO --模拟插入数据 
    INSERT TA SELECT 'TEST',GETDATE(); 
    INSERT TA SELECT 'TEST2',GETDATE(); --查看记录的标识列数据 
    SELECT * FROM TB; 
    /* 
    ID          name                                               MODIFIEDDATE 
    ----------- -------------------------------------------------- ----------------------- 
    1           TEST                                               2008-10-02 17:53:46.780 
    2           TEST2                                              2008-10-02 17:53:46.870 (2 行受影响) */ 
    DROP TABLE TB,TA; 
        最后说明一下使用OUTPUT子句的注意事项: 
        以下语句中不支持 OUTPUT 子句:     1、引用本地分区视图、分布式分区视图或远程表的 DML 语句。  
        2、包含 EXECUTE 语句的 INSERT 语句。 
        3、不能将 OUTPUT INTO 子句插入视图或行集函数。 
        4、参数或变量作为 UPDATE 语句的一部分进行了修改,则 OUTPUT 子句将始终返回语句执行之前的参数或变量的值而不是已修改的值 
      

  3.   

    插入之前先清空临时表.用触发器吧,把数据放到某个变量或表中. 
    大致方法如下: 
    临时表为tb(myGUID) 
    create trigger my_trig on A for insert 
    as 
    being
      delete from tb
      insert into tb select GUID from inserted 
    end
    go
      

  4.   

    但是注意上面介绍的OUTPUT语句只能在SQL2005中使用
      

  5.   

    INSERT INTO A([NAME])
    OUTPUT INSERTED.[ID]
    VALUES('XX')
      

  6.   

    ---------------------------------------------
    --> Author : js_szy
    --> Target : 各位大大,小卒就是想要一朵花
    --> Date   : 2009-11-30 16:34:29
    --> Version: SQL Server 2005
    ---------------------------------------------
        
    --> 测试数据: @tb
    declare @tb table (id int identity(1,1),name varchar(20)) -------->SQL 2000
    insert into @tb select 'a' select id=@@identity
    /*
    id
    ---------------------------------------
    1(1 行受影响)
    */
    ------->SQL 2005insert @tb 
    output 
    inserted.id
    select 'b'id
    -----------
    2(1 行受影响)
      

  7.   

    你们给的这些怎么把它插入到B表的GUID字段
      

  8.   

    改写这个表的定义和对表的Insert方法CREATE PROC dbo.表名_Insert
      @ID UNIQUEIDENTIFIER OUTPUT,
      @其他项目1,
      @其他项目2
    AS
      SET @ID = NEWID()
    INSERT INTO dbo.表名(
      ID,
      其他项目1,
      其他项目2
    )
    VALUES
    (
     @ID,
     @其他项目1,
     @其他项目2
    )
    RETURN @@ERROR
    表的定义里面的ID就可以不用GUID定义了,以后的插入操作都用上面的存储过程代替
    存储过程的返回值就是刚生成的GUID
      

  9.   

    上面说的都很复杂,没有简单的办法吗
    (urdoom)那怎么接收你的这个过程的返回值,给个例子,比如把返回值插入另外一个表的Guid字段
      

  10.   


    --select * from tb
    create table tb (key_id nvarchar(10),length int,atype nvarchar(10))
    declare @a table(key_id nvarchar(10),length int,atype nvarchar(10))
    insert into tb 
     output inserted.key_Id,
            inserted.length,
            inserted.atype
          into @a
    select 'jia',50,'china'
    select * from @a
    go
    drop table tb/*(1 行受影响)
    key_id     length      atype
    ---------- ----------- ----------
    jia        50          china(1 行受影响)
    */