sql - 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 列,列不允许空值,插入失败
知道如何解决这个问题吗?任何帮助表示赞赏。
解决方案
我将回答你为什么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);
另请注意,您将列/参数定义name
为varchar(1)
. 我建议解决这个问题,因为很少有人(如果有的话)的名字只有一个字符。
推荐阅读
- react-native - 如何将 tensorflow 1.x 模型转换为 tensorflowJS?
- node.js - 使用 sequalise 获取日期小于当前日期的数据
- node.js - 如何使用 REACT-NATIVE / React-Navigation 让我的用户保持登录 + 在它自己的 StackNavigator 中
- ios - 应用内购买。没有身份验证插件来验证 com.apple.account.iTunesStore.sandbox 类型帐户的凭据
- node.js - 使用 mem-fs-editor copyTpl 但希望从复制中排除某些文件
- amazon-web-services - 启动 EC2 实例时看不到 EFS 文件
- go - 如何在截断正态分布范围内生成随机数
- django - 在 django rest 框架中处理多部分表单数据时遇到问题
- javascript - 如何在 yyyy-mm-dd 格式的 javascript 中将日期字符串转换为日期对象
- node.js - 时尚商务的 Elasticsearch