如何解决使用@@IDENTITY 的正确方法是什么
关于 @@IDENTITY
的问题,我有 4 个不同的表:
- 客户 [Id]
- 人员 [Id,fname,lname]
- 帐户 [CD、所有者、余额]
- 交易 [ID、帐户、类型]
Customer Id 具有身份增量 1 的特征。
Customer.Id = Person.Id = Account.owner = Transaction.ID
我已尝试以下操作,但出现此错误:
无法在列所有者中插入空值
我如何纠正错误以使其正常工作?
BEGIN TRAN
BEGIN TRY
INSERT INTO bank.customer DEFAULT VALUES
INSERT INTO bank.person (id,lname)
VALUES (@@IDENTITY,'Mike','Phelps')
INSERT INTO bank.account (cd,owner,balance)
VALUES (2,@@IDENTITY,0)
INSERT INTO bank.transaction (id,account,type)
VALUES (@@IDENTITY,(SELECT cd FROM pankki.tili,'P')
END TRY
BEGIN CATCH
ROLLBACK
SELECT
ERROR_NUMBER() AS ErrorNumber,ERROR_STATE() AS ErrorState,ERROR_SEVERITY() AS ErrorSeverity,ERROR_PROCEDURE() AS ErrorProcedure,ERROR_LINE() AS ErrorLine,ERROR_MESSAGE() AS ErrorMessage;
END CATCH
解决方法
我怀疑你想要的是这个:
BEGIN TRY
BEGIN TRAN;
DECLARE @ID int; --bigint,decimal?
INSERT INTO bank.customer DEFAULT VALUES;
SET @ID = SCOPE_IDENTITY(); --Assumes customer has a column with an IDENTITY
INSERT INTO bank.person (id,fname,lname)
VALUES(@ID,'Mike','Phelps');
INSERT INTO bank.account (cd,owner,balance)
VALUES(2,@ID,0);
INSERT INTO bank.transaction(id,account,type)
SELECT @ID,cd,'P'
FROM pankki.tili; --I assume,therefore,that pankki.tili only ever has 1 row
COMMIT; --YOu were missing this
END TRY
BEGIN CATCH
ROLLBACK;
THROW; --Don't SELECT the error details,THROW it.
END CATCH
,
来自微软文档:
在 INSERT、SELECT INTO 或批量复制语句完成后,@@IDENTITY 包含该语句生成的最后一个标识值。如果该语句不影响具有标识列的任何表,@@IDENTITY 将返回 NULL。
我认为 PERSON 没有标识列,所以当你插入它时,@@identity 变为 NULL。
如果您想将插入中的@@identity 用于其他表,请使用它来设置变量的值。
declare @PersistentID int;
INSERT INTO bank.customer DEFAULT VALUES
set @PersistentID = @@IDENTITY -- or scope_identity() is safer
INSERT INTO bank.person (id,lname)
VALUES( @PersistentID,'Phelps')
,
首先需要了解这两个命令的区别:
-
@@identity
返回当前会话中任何表中最后插入的标识值,不考虑作用域。 -
IDENT_CURRENT('table_or_view')
返回最后插入的 GIVEN 表的标识值。
因此,对于您的情况,您需要使用第二个。
你的脚本应该是这样的:
BEGIN TRAN
BEGIN TRY
INSERT INTO bank.customer DEFAULT VALUES
SET @customerID = (SELECT IDENT_CURRENT('bank.customer'))
INSERT INTO bank.person (id,lname)
VALUES( @customerID,'Phelps')
INSERT INTO bank.account (cd,balance)
VALUES(2,@customerID,0)
INSERT INTO bank.transaction(id,type)
VALUES(@customerID,(SELECT cd FROM pankki.tili,'P')
END TRY
这样就可以保证在四个表中插入相同的ID。
如果您使用的是 @@identity
,这个值会随着每个新的插入而改变。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。