首页 > 解决方案 > Scope_identity 给出空值?

问题描述

我有我使用的存储过程scope_identity()

Create table table1
    id int,
    name varchar,
    age int 
Create procedure details
    @id int,
    @name varchar,
    age int
    
    Select @old_id = id , @name =  name ,@age = age
    from table1 
    where id = @id
    
    if @old_id is null
    begin
        insert into table1(id, name , age)
        Select scope_identity(), @name, @age
    end

我得到的错误:

无法将空值插入 id 列,列不允许空值,插入失败

知道如何解决这个问题吗?任何帮助表示赞赏。

标签: sqlsql-serverscope-identity

解决方案


我将回答你为什么NULL在这里得到一个,尽管这个答案不太可能回答你真正问的问题;当然我不能回答这个问题,而且你从来没有告诉我们这个问题是什么。

如所有注释中所述,SCOPE_IDENTITY返回当前范围内IDENTITY生成的最后一个值的值。引用文档

返回插入到同一范围内的标识列中的最后一个标识值。范围是一个模块:存储过程、触发器、函数或批处理。因此,如果两个语句在同一个存储过程、函数或批处理中,它们就在同一个范围内。

在你的程序中没有先验INSERT,所以没有先验生成值,因此SCOPE_IDENTITY只能NULL。结果,这意味着该INSERT语句失败,因为您的列id(我假设它实际上是一个外键)不能是NULL.

使用 of的正常SCOPE_IDENTITY()语句如下所示:

INSERT INTO dbo.SomeTable (SomeColumn) --SomeTable has a column with the IDENTITY property
VALUES(@SomeValue);

INSERT INTO dbo.AnotherTable(ForeignKey, AnotherColumn)
VALUES(SCOPE_IDENTITY(), @AnotherValue);

另请注意,您将列/参数定义namevarchar(1). 我建议解决这个问题,因为很少有人(如果有的话)的名字只有一个字符。


推荐阅读