2017-04-14 57 views
0
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 ; 

我的问题在这里当没有记录插入到表Remittance@RemittanceID是越来越Transactions表的标识值。插入到多个表与标识列

所以我们说插入事务表标识值是1,没有记录在Remittance表,然后@TransactionID@RemittanceID都被设置为1,但我想@TransactionID值设置为1,@RemittanceID为空。

有没有什么办法,这样,如果没有插入Remittance表记录,@RemittanceID值应设置为NULL。

+1

您应该考虑使用OUTPUT。 https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql如果你要坚持两个单独的语句,你应该使用SCOPE_IDENTITY来代替。 https://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/ –

+0

我也建议使用* * SCOPE_IDENTITY()'**而不是其他任何东西来获取新插入的标识值。 [请参阅此博客文章,了解有关WHY的解释](http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity -of-record /) –

回答

0

您可以在这里使用@@ROWCOUNT来确定是否在最后一条语句内发生更新。

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 
0

尝试这两个函数:

  1. IDENT_CURRENT( '表名')

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

    • 返回插入在相同的范围的标识列的最后一个标识值。范围是一个模块:存储过程,触发器,函数或批处理。因此,如果两个语句处于相同的存储过程,函数或批处理中,它们在相同的范围内。 +

随着上述#1,请记住它可以得到一些其他的会话标识值,如果你的程序可以同时运行。

也许你可以一起使用两者。

+1

我同意肖恩。我认为OUTPUT会解决你的问题。你可以用一列声明一个新的表变量,并在表变量中插入标识列值 – Nayak