代码之家  ›  专栏  ›  技术社区  ›  Seibar

@@以及检索最后一个标识的OUTPUT()和其他方法

  •  54
  • Seibar  · 技术社区  · 17 年前

    我见过在插入后检索主键标识字段的值时使用的各种方法。

    declare @t table (
        id int identity primary key,
        somecol datetime default getdate()
    )
    insert into @t
    default values
    
    select SCOPE_IDENTITY() --returns 1
    select @@IDENTITY --returns 1
    

    在插入后返回标识表:

    Create Table #Testing (  
        id int identity,  
        somedate datetime default getdate()  
    )  
    insert into #Testing  
    output inserted.*  
    default values   
    

    什么方法是正确的或更好的?输出方法范围安全吗?

    第二个代码片段是从 SQL in the Wild

    8 回复  |  直到 11 年前
        1
  •  75
  •   mson    17 年前

    这取决于你想做什么。。。

    返回在连接上生成的最后一个标识值,而不管生成该值的表是什么,也不管生成该值的语句的范围如何。 @@IDENTITY将返回当前会话中输入到表中的最后一个标识值。@@标识仅限于当前会话,而不限于当前范围。例如,如果某个表上的触发器导致在另一个表中创建标识,则将获得最后创建的标识,即使它是创建它的触发器。

    返回在同一范围内由连接和语句生成的最后一个标识值,而不管生成该值的表是什么。 SCOPE\u IDENTITY()与@@IDENTITY相似,但它也将值限制为当前范围。换句话说,它将返回您显式创建的最后一个标识值,而不是由触发器或用户定义函数创建的任何标识。

    当前标识符()

        2
  •  14
  •   MarredCheese Lionia Vasilev    6 年前

    请注意,中有一个bug scope_identity() @@identity https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811

    引用(来自Microsoft):

    我强烈建议使用 OUTPUT @@IDENTITY 在所有情况下。 这是读取标识和时间戳的最好方法。

    已编辑以添加:现在可能已修复此问题。Connect出错,但请参阅:

    Scope_Identity() returning incorrect value fixed?

        3
  •  10
  •   JeremyWeir    11 年前

    除了使用 OUTPUT

    下面是一个在插入一行后获取id的简单示例。。。

    DECLARE @Inserted AS TABLE (MyTableId INT);
    
    INSERT [MyTable] (MyTableColOne, MyTableColTwo)
    OUTPUT Inserted.MyTableId INTO @Inserted
    VALUES ('Val1','Val2')
    
    SELECT MyTableId FROM @Inserted
    

    输出条款的详细文件: http://technet.microsoft.com/en-us/library/ms177564.aspx


    -- table structure for example:     
    CREATE TABLE MyTable (
        MyTableId int NOT NULL IDENTITY (1, 1),
        MyTableColOne varchar(50) NOT NULL,
        MyTableColTwo varchar(50) NOT NULL
    )
    
        4
  •  6
  •   jcollum    17 年前

    @@认同是老派的做法。在以后的所有实例中使用SCOPE_IDENTITY()。看到了吗 MSDN 对于使用@@IDENTITY的后果(他们很糟糕!)。

        5
  •  4
  •   Cade Roux    17 年前

    对于多行,OUTPUT/OUTPUT INTO是您新的最好的朋友,也是重新查找行并插入另一个表的替代方法。

        6
  •  3
  •   Seibar    17 年前

    in SQL in the Wild

    这将允许您在插入后检索多个标识。以下是博文中的代码:

    Create Table #Testing (  
        id int identity,  
        somedate datetime default getdate()  
    )  
    insert into #Testing  
    output inserted.*  
    default values
    
        7
  •  3
  •   Paul Sasik    17 年前

    对戈代克的回答作了小小的修正:

        8
  •  1
  •   Pato    16 年前