Sql 插入到具有标识列的多个表中

Sql 插入到具有标识列的多个表中,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我这里的问题是,当没有记录插入汇款表时,@remittenaceid将获取交易表的标识值 假设事务表中插入的标识值为1,汇款表中没有记录,那么@TransactionID和@transmittanceid都设置为1,但我希望@TransactionID值设置为1,@transmittanceid为空 有没有办法,如果没有记录插入到汇款表中,@remittenaceid值应该设置为NULL。您可以在这里使用@@ROWCOUNT来确定上一条语句中是否发生了更新 INSERT INTO [dbo].[

我这里的问题是,当没有记录插入
汇款
表时,
@remittenaceid
将获取
交易
表的标识值

假设事务表中插入的标识值为1,
汇款
表中没有记录,那么
@TransactionID
@transmittanceid
都设置为1,但我希望
@TransactionID
值设置为1,
@transmittanceid
为空


有没有办法,如果没有记录插入到
汇款
表中,
@remittenaceid
值应该设置为NULL。

您可以在这里使用
@@ROWCOUNT
来确定上一条语句中是否发生了更新

INSERT INTO [dbo].[Transactions] ([PartnerId], [TransactionId], [ver], [InsertedBy], [InsertedDateTime], [SavedBy], [SavedDateTime])
    SELECT     
        [PartnerId], [TransactionId], [ver], [InsertedBy],
        [InsertedDateTime], [SavedBy], [SavedDateTime] 
    FROM        
        @parTransaction;

SET @TransactionID = @@IDENTITY;

INSERT INTO [dbo].[Remittances] ([TransactionID], [RemittanceTransactionId],[InsertedBy], [InsertedDateTime], [SavedBy], [SavedDateTime])
    SELECT 
        @TransactionID, [RemittanceTransactionId], [InsertedBy],
        [InsertedDateTime], [SavedBy], [SavedDateTime]
    FROM         
        @parRemittance;

SET @RemittanceID = @@IDENTITY ;

尝试以下两个功能:

  • 当前标识(“表名”)

    • 返回为指定表或视图生成的最后一个标识值。最后生成的标识值可以用于任何会话和任何作用域
  • 范围_标识()

    • 返回插入到同一范围内标识列中的最后一个标识值。作用域是一个模块:存储过程、触发器、函数或批处理。因此,如果两条语句位于同一存储过程、函数或批处理中,则它们位于同一范围内+
  • 使用上面的#1,请记住,如果您的过程可以并发运行,它可以从其他会话获取标识值


    也许,您可以同时使用这两种方法。

    您应该考虑使用输出。如果要坚持使用两个独立的语句,则应该使用SCOPE\u IDENTITY。我还建议使用
    SCOPE\u IDENTITY()
    而不是其他任何东西来获取新插入的标识值。我同意肖恩的看法。我想输出能解决你的问题。只需声明一个包含一列的新表变量,并在表变量中插入标识列值
      INSERT INTO [dbo].[Remittances]
                               ([TransactionID],[RemittanceTransactionId],[InsertedBy],[InsertedDateTime],[SavedBy],[SavedDateTime])
                   SELECT 
                                @TransactionID,[RemittanceTransactionId],[InsertedBy],[InsertedDateTime],[SavedBy],[SavedDateTime]
                   FROM         @parRemittance;
    
                   SET         @RemittanceID =  @@IDENTITY ;
    
    
         IF(@@ROWCOUNT=0) SET @RemittanceID = NULL