2012-08-16 53 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