zoukankan      html  css  js  c++  java
  • 在output 子句和 scope_identity() 混合使用的时候的注意事项

    无意睹到一篇旧文档

    SR0008:考虑使用 SCOPE_IDENTITY 代替 @@IDENTITY :https://msdn.microsoft.com/zh-cn/library/dd172121(v=vs.100).aspx

    日常开发,我们如果在插入记录的同时需要返回插入的IdentityID,通常我们会使用

    @@Identity 和使用函数 Scope_identity()

    当然在并发的情况下,使用scope_identity会比使用@@Identity稳定。起码我不用考虑触发器的影响。

    但是如果在insert 的同时使用了insert into xxx output into yyy 这种语法的话。就要小心scope_identity返回的值。那将会是yyy表的identity值哦。

    下面我们来做一个实验

    CREATE TABLE aaa(ID INT IDENTITY,Col VARCHAR(50))
    CREATE TABLE bbb(ID INT IDENTITY,Col VARCHAR(50))
    
    INSERT INTO dbo.aaa ( Col )VALUES  ( 'aaa' )
    
    INSERT INTO dbo.aaa ( Col ) OUTPUT Inserted.Col INTO bbb(Co1) VALUES  ( 'aaa' )
    SELECT SCOPE_IDENTITY()

    语句很简单,就创建2个表。然后insert 2条数据而已。但是最后在scope_identity 里面返回的结果并不是2 ,而是1 因为虽然写入aaa的自增列ID是1 ,但是本会话最新创建的identity确实bbb id = 1 所以返回的结果是1 而不是2

    因为做测试遇到这个例子,写一篇blog 来分享记录一下

  • 相关阅读:
    datalist的用法
    SQL级联删除——删除主表同时删除从表——同时删除具有主外键关系的表
    js
    回调机制
    JS原型链
    多线程请求乌云链接
    Python高频技巧总结[基础篇]
    批量文本读取URL获取正常访问且保留对应IP
    Django基础之视图
    Django框架简介
  • 原文地址:https://www.cnblogs.com/Gin-23333/p/5950307.html
Copyright © 2011-2022 走看看