0

以下は、ストアドプロシージャのコードです。

コードの最初の部分は、想定どおりに機能します。変数を受け取り、1つのテーブルにINSERTを実行し、次にそのアクションから作成された主キーを使用して、別のテーブルに別のINSERTを実行します。

ただし、発生しないのは、if / else if/elseブロックのthenendに向かうコードです。基本的に、2つのID列が正しく一致していることを確認する必要があります。そうでない場合は、列を適切な値に調整してから、古い値に加えて、エントリを作成した人の日付とユーザー名(lastChangeOperator)を返します。

私はこのプログラムとこのプログラムの別の部分を一日中書いてきたので、2番目の目がうまくいくことを望んでいます。

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
4

1 に答える 1

1

SCOPE_IDENTITY()代わりに使ってみました@@IDENTITYか?これがあなたの問題かもしれないと思います。

ピナルデイブがここで言うように

* "後でトリガーを追加することに関連する潜在的な問題を回避するには、常にSCOPE_IDENTITY()を使用して、TSQLステートメントまたはストアドプロシージャに最近追加された行のIDを返します。"*

于 2012-08-17T00:58:39.523 に答える