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()的值却为空.........

  • 相关阅读:
    解决PKIX:unable to find valid certification path to requested target 的问题
    Linux 上的常用文件传输方式介绍与比较
    用VNC远程图形化连接Linux桌面的配置方法
    红帽中出现”This system is not registered with RHN”的解决方案
    linux安装时出现your cpu does not support long mode的解决方法
    CentOS SSH配置
    es6扩展运算符及rest运算符总结
    es6解构赋值总结
    tortoisegit安装、clon、推送
    es6环境搭建
  • 原文地址:https://www.cnblogs.com/wangshuai/p/1635689.html
Copyright © 2011-2022 走看看