zoukankan      html  css  js  c++  java
  • 插入一条空记录并返回空记录的ID

    今天真是郁闷的一天....


    今天写一个Stored Procedure.功能是:把表名作为一个变量传入存储过程,然后在该表中插入一条空的记录,并且返回该 记录 的主键ID号.

    在表中插入 一条空的记录如下:

    Insert into tablename default values

    数据库的字段默认值为null

    因为在该存储过程中表名为一个变量(@TableName)
    如果这样:

    create procedure insertnull
    @TableName varchar(50),
    @Result int
    as
    insert into @TableName default values //这一句是会报错的,提示@tablename没有定义

    解决方法如下:

    create procedure insertnull
     @TableName varchar(50),
     @Result int
    as
    declare @sqlcmd varchar(1000)
     set @sqlcmd='insert into '+@TableName+' default values'
     exec(@sqlcmd)

    这样就实现了随便给一个表名就可以在里面插入一条空的记录

    现在还有一个问题 就是返回刚刚插入记录的ID值,ID是自增长的int型字段

    在SQL中可以使用
                   1.SCOPE_IDENTITY()
                   2.@@IDENTITY
                   3.IDENT_CURRENT()

    SCOPE_IDENTITY() 返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。

    @@IDENTITY       返回在当前会话的所有表中生成的最后一个标识值,没有参数


    IDENT_CURRENT() 返回为任何会话和任何作用域中的指定表最后生成的标识值, 其中的参数,是表名


    因此,对于这种情况,建议大家慎用 @@IDENTITY,而尽量采用 SCOPE_IDENTITY() 函数替换之。SCOPE_IDENTITY() 也是得到最后一条自增域的值,但是它是仅限在一个操作范围之内,而不@@IDENTITY 是取全局操作的最后一步操作所产生的自增域的值的


    当在Exec(@sqlcmd) 后添加 set @Result=SCOPE_IDENTITY()是,调用返回的值却为 null
    上网差了好多的资料也没有解决,可能是 因为变量生存周期的问题.


    如何是把表名"写死"的话就可以

    create procedure insertnull
    @resultid int output
    as
    insert into tablename default values
    set @resultid=SCOPE_IDENTITY()

    在此代码中可以实现上面的功能:为表tablename中插入一条空的记录 ,并返回 该记录的id值,但是表名是"死"的,不够灵活
    如果要用变量来代替表明,那就要拼字符串 ,用exec(@sql)去 执行这条SQL语句,但是 下面的set @resultid=SCOPE_IDENTITY()的值却为空.........

  • 相关阅读:
    AJ学IOS(47)之网易彩票帮助界面UIWebView的运用
    AJ学IOS(46)之网易彩票幸运大转盘
    AJ学IOS(45)之常用的小功能比如打电话、打开网址、发邮件、发短信打开其他应用。
    AJ学IOS(44)之网易彩票自定义图片在右边的Button_弹出view_ios6,7简单适配
    AJ学IOS(43)之网易彩票底部自定义TabBar实现切换
    AJ学IOS(42)UI之核心动画CAAnimationGroup以及其他
    数组扁平化方法
    Echart数据转换(水平数据变成垂直数据)
    划重点简易版
    获取鼠标点击位置坐标
  • 原文地址:https://www.cnblogs.com/wangshuai/p/1635689.html
Copyright © 2011-2022 走看看