2012-08-16 75 views
0

下面是存儲過程的代碼。SQL存儲過程無法正常工作

該代碼的第一部分按照預期工作。它接受變量,將INSERT插入到一個表中,然後使用從該操作創建的主鍵在另一個表上執行另一個INSERT。

然而,不會發生的是if/else if/else塊中的代碼朝向結束。基本上應該檢查以確保兩個ID列匹配正確。如果不是,則將列調整爲適當的值,然後返回舊值加上輸入者的日期和用戶名(lastChangeOperator)。

我已經花了整整一天的時間寫這個和這個程序的另一部分,所以我希望第二組眼睛能夠做到這一點。

ALTER PROCEDURE [dbo].[sp_AgentIdAprCheck] 
    (
    @companyCode char(3), 
    @agentId char(10), 
    @firstName nvarChar(50), 
    @lastname nvarChar(50), 
    @suffix char(10), 
    @ssn int, 
    @taxIdType char(1), 
    @entityType char(1), 
    @corporateName nvarChar(100), 
    @currentUniqueId int OUTPUT, 
    @currentAgentId int OUTPUT, 
    @operator nvarchar(50) OUTPUT, 
    @date datetime OUTPUT 
) 
    AS 
    DECLARE @rows int = 0 
    DECLARE @uniqueAgentId int = 0 
    DECLARE @lastChangeOperator char(6) = 'LVOMQ1' 
    DECLARE @LastChangeDate datetime 
    --DECLARE @currentUniqueId int = 0 
    --DECLARE @currentAgent int = 0 
    --DECLARE @operator nvarchar(50) 
    --DECLARE @date datetime 

    SELECT @rows = COUNT(AgentTaxId) 
     FROM AgentIdentification 
     WHERE AgentTaxId = @ssn 

    if @rows > 0 
     return 1 
    else 
     BEGIN TRANSACTION 
     SET @LastChangeDate = GETDATE() 
     INSERT INTO Agent (EntityType, FirstName, LastName, 
     NameSuffix, CorporateName, LastChangeOperator, LastChangeDate) 
     VALUES (@entityType, @firstName, @lastname, 
     '', @corporateName, @lastChangeOperator, @LastChangeDate) 

     SELECT @uniqueAgentId = @@IDENTITY 
     SELECT UniqueAgentId 
     FROM Agent 

     INSERT INTO AgentIdentification (UniqueAgentId, TaxIdType, 
     AgentTaxId, LastChangeOperator, LastChangeDate) 
     VALUES (@uniqueAgentId, @taxIdType, @ssn, @ 
     lastChangeOperator, @lastChangeDate) 

     DECLARE @uniqueIdRows int = 0 
     SELECT @uniqueIdRows = COUNT(UniqueAgentId) 
    FROM UniqueAgentIdToAgentId 
    WHERE UniqueAgentId = @uniqueAgentId 

     DECLARE @agentIdRows int = 0 
     SELECT @agentIdRows = COUNT(AgentId) 
     FROM UniqueAgentIdToAgentId 
     WHERE AgentId = @agentId 

     if @uniqueIdRows = 0 AND @agentIdRows = 0 
     BEGIN 
      INSERT INTO UniqueAgentIdToAgentId (UniqueAgentId, AgentId, 
      CompanyCode, LastChangeOperator, LastChangeDate) 
      VALUES (@uniqueAgentId, @agentId, @companyCode, 
      @lastChangeOperator, @LastChangeDate) 
     END 
     else if @agentIdRows = 0 
     BEGIN   
      SELECT @currentUniqueId = UniqueAgentId, 
      @operator = LastChangeOperator, @date = @LastChangeDate 
      FROM UniqueAgentIdToAgentId 

      UPDATE UniqueAgentIdToAgentId 
      SET UniqueAgentId = @uniqueAgentId 
      WHERE AgentId = @agentId AND UniqueAgentId = @currentUniqueId 
     END 
     else 
     BEGIN   
      SELECT @currentAgentId = AgentId, 
      @operator = LastChangeOperator, @date = @LastChangeDate 
      FROM UniqueAgentIdToAgentId 

      UPDATE UniqueAgentIdToAgentId 
      SET AgentId = @agentId 
      WHERE UniqueAgentId = @uniqueAgentId --AND AgentId = @currentAgentId 
      return 2 
     END 
     COMMIT TRANSACTION 
+0

因此IF/ELSE IF/ELSE沒有運行?默認情況下,ELSE不會總是運行?你也有一個選擇語句和輸出參數。你如何處理返回的數據?最後,你是否已經逐步確定'uniqueIdRows'和'agentIdRows'變量是否按預期填充? – CoderMarkus 2012-08-17 00:26:25

回答

1

您是否嘗試過使用SCOPE_IDENTITY()代替@@IDENTITY?我猜這可能是你的問題。

由於皮納爾戴夫說:here

*「爲了避免以後將觸發相關的潛在問題,請始終使用SCOPE_IDENTITY()返回最近添加的行的身份在你的T SQL語句或存儲過程。「*

+1

[範圍標識有時返回不正確的值](https://connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes-returns-incorrect-value)。只是在說'。 – HABO 2012-08-17 02:17:08

+0

感謝您的提醒。根據我自己的經驗,Scope_Identity修復了使用@@ Identity導致的所有問題,但我沒有遇到任何Scope_Identity失敗。現在我不能在晚上睡覺! – DeanOC 2012-08-17 04:32:59