微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用@@IDENTITY 的正确方法是什么

如何解决使用@@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')
,

首先需要了解这两个命令的区别:

  1. @@identity 返回当前会话中任何表中最后插入的标识值,不考虑作用域。
  2. 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?