Scope_identity 给出空值?

Scope_identity is giving null values?

我有使用 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

我得到的错误:

cannot insert null into id column, column does not allow null, insert fail

知道如何解决这个问题吗?感谢任何帮助。

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

如所有评论中所述,SCOPE_IDENTITY returns 在 当前 范围内生成的最后一个 IDENTITY 值的值。引用 documentation:

Returns the last identity value inserted into an identity column in the same scope. A scope is a module: a stored procedure, trigger, function, or batch. Therefore, if two statements are in the same stored procedure, function, or batch, they are in the same scope.

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

使用 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);

另外请注意,您将 column/parameter name 定义为 varchar(1)。我建议解决这个问题,因为很少有人(如果有的话)的名字只有一个字符。