zoukankan      html  css  js  c++  java
  • 一句SQL实现获取自增列操作


    今天做了一个应用,对TAB_1表进行插入操作的时候,需要获取自增ID的值,插入到TAB_2里面,隐隐约约记得SQL里面有个全局变量@@IDENTITY可以实现这样的业务需要,凭着感觉写了下面的SQL语句。
    string sql = "INSERT INTO TAB_1(COL_1) VALUES('VALUE_1') \r\n INSERT INTO TAB_2(COL_1) VALUES(SELECT @@IDENTITY)"
    结果报错.....看来第一感觉还是错了。

    GOOGLE找一下,搜索了关键字“SQL 获取自增列 插入”结果搜出N多答案,大概可以分成几类:
    1.对TAB_1进行插入操作后,通过SqlHeper.ExecuteScalar执行"SELECT @@IDENTITY"这样的SQL语句来返回一个Object,这样需要把自增列取到程序中再进行拼接SQL处理。

    2.还看到一猛男这样写的:
    string sql = "INSERT INTO TAB_1(COL_1) VALUES('VALUE_1') \r\n INSERT INTO TAB_2(COL_1) VALUES(SELECT CAST(@@SCOPE_IDENTITY()  AS INT))" 结果一运行还是报错。

    思考:这个时候站起来倒茶,思考下,难道想一句SQL语句不能实现吗?突然想到以前看PetShop的源码的时候,有类似的实现的。
    string sql = "INSERT INTO TAB_1(COL_1) VALUES('VALUE_1') \r\n DECLARE @UID INT \r\n SELECT @UID = SCOPE_IDENTITY() \r\n INSERT INTO TAB_2(COL_1) VALUES(@UID)"
    这时候怀着激动的心情F5刷新,运行成功没有报错,检查数据库插入TAB_1时生成的自增主键,已经插入到TAB_2中去了,业务逻辑实现实现的同时,也达到我的期望值,Perfect...怀着激动的心情写下了这篇日志,记录下心情。最后就是附上一点网上收集的资料。
    --------------------------------------------------------------------------------------------------------------------------------------------
    @@IDENTITY
    返回最后插入的标识值。

    语法
    @@IDENTITY

    返回类型
    numeric

    注释
    在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生的最后的标识值。若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。若插入了多个行,则会产生多个标识值,@@IDENTITY 返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器,则语句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失败或大容量复制失败,或事务被回滚,则 @@IDENTITY 值不会还原为以前的设置。

    在返回插入到表的 @@IDENTITY 列的最后一个值方面,@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 函数类似。

    @@IDENTITY 和 SCOPE_IDENTITY 将返回在当前会话的所有表中生成的最后一个标识值。但是,SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。

    IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回任何会话和任何作用域中为特定表生成的标识值。有关更多信息,请参见 IDENT_CURRENT。

    示例
    下面的示例向带有标识列的表中插入一行,并用 @@IDENTITY 显示在新行中使用的标识值。

    INSERT INTO jobs (job_desc,min_lvl,max_lvl)
    VALUES ('Accountant',12,125)
    SELECT @@IDENTITY AS 'Identity'
    ---------------------------------
    从SQL的帮助文档中直接COPY过来的,其实微软的帮助文档是最好的老师,最好学会直接查看帮助文档.

  • 相关阅读:
    Unix命令大全
    vs2008 与 IE8出现的兼容性问题
    Java 创建文件、文件夹以及临时文件
    如何修改Wamp中mysql默认空密码
    PAT 乙级真题 1003.数素数
    Tags support in htmlText flash as3
    DelphiXE4 FireMonkey 试玩记录,开发IOS应用 还是移植
    10 Great iphone App Review sites to Promote your Apps!
    HTML tags in textfield
    Delphi XE4 IOS 开发, "No eligible applications were found“
  • 原文地址:https://www.cnblogs.com/JavCof/p/1562913.html
Copyright © 2011-2022 走看看