2017-04-14 58 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