2017-09-06 17 views
0

SQL Serverストアドプロシージャに問題があります。両方のテーブルに同じIDのデータがすでに存在するかどうかを確認しようとしています。それが最初に実行されるIFが存在しません。正しく動作しません。

ALTER PROCEDURE [dbo].[Objective_Comment_Insert] 
    @CompanyName AS NVARCHAR(100) 
AS 
BEGIN 
    IF NOT EXISTS (SELECT * 
        FROM dbo.[SB$Objective Comment] oc, [dbo].[comments] cc 
        WHERE CONVERT(INT, oc.[Employee No_]) = (SELECT u1.employee_no 
                  FROM c0_intranet.dbo.users u1 
                  WHERE u1.user_id = cc.user_id) 
        AND oc.[No_] = cc.comment_id) 
    BEGIN 
     INSERT INTO dbo.[SB$Objective Comment]([Comment By], [Comment], [Date Created], 
               [No_], [Comment On], [Employee No_]) 
      SELECT 
       (SELECT u1.employee_no 
       FROM c0_intranet.dbo.users u1 
       WHERE u1.user_id = cs.user_id 
       ), 
       CASE 
        WHEN cs.comment IS NULL 
         THEN '' 
         ELSE cs.comment 
       END, 
       CASE 
        WHEN cs.date_created IS NULL 
         THEN FORMAT(GETDATE(), 'yyyy-MM-dd') 
         ELSE FORMAT(cs.date_created, 'yyyy-MM-dd') 
       END, 
       cs.comment_id, 
       CASE 
        WHEN cs.comment_on IS NULL 
         THEN 0 
         ELSE cs.comment_on 
       END, 
       (SELECT u1.employee_no 
       FROM dbo.users u1 
       WHERE u1.user_id = cs.user_id) 
      FROM 
       dbo.comments cs 
    END 
    ELSE 
    BEGIN 
     UPDATE NAV_2017.dbo.[SB$Objective Comment] 
     SET [Comment By] = (SELECT u1.employee_no 
          FROM dbo.users u1 
          WHERE u1.user_id = cs.user_id), 
      [Comment] = CASE 
          WHEN cs.comment IS NULL 
           THEN '' 
           ELSE cs.comment 
         END, 
      [Date Created] = CASE 
           WHEN cs.date_created IS NULL 
            THEN FORMAT(GETDATE(), 'yyyy-MM-dd') 
            ELSE FORMAT(cs.date_created, 'yyyy-MM-dd') 
          END, 
      [No_] = cs.comment_id, 
      [Comment On] = CASE 
           WHEN cs.comment_on IS NULL 
           THEN 0 
           ELSE cs.comment_on 
          END, 
      [Employee No_] = (SELECT u1.employee_no 
           FROM dbo.users u1 
           WHERE u1.user_id = cs.user_id) 
     FROM dbo.comments cs, NAV_2017.dbo.[SB$Objective Comment] oc 
     WHERE 
      CONVERT(INT, oc.[Employee No_]) = (SELECT u1.employee_no 
               FROM dbo.users u1 
               WHERE u1.user_id = cs.user_id) 
      AND oc.[No_] = cs.comment_id 
    END 
END 

は、第二のテーブルにデータがないと私は最初のテーブル内の別のレコードを追加した後、それが動作し、第2のテーブルに挿入していませんが、エラーはありません。

This is when I execute the procedure inside exists

This is data from table comments

+1

どのdbmsを使用していますか? (このコードは製品固有です。) – jarlh

+0

sql 2012.製品固有のものです。私は自分の手続きの一部に問題があります。そしてなぜ私は構成することができません –

+1

EXISTSの中にあるSELECTステートメントだけを実行すると、どのレコードが表示されますか? –

答えて

0

私が正しくあなたのロジックを再構成した場合、このクエリはあなたに等しい:

select 1 
from [dbo].[comments] cc 
    join c0_intranet.dbo.users u1 on u1.user_id = cc.user_id 
    join dbo.[SB$Objective Comment] oc on oc.[No_] = cc.comment_id and CONVERT(int, oc.[Employee No_] = u1.employee_no 

そうであれば、任意のデータが既に存在する場合、それは常に行を返しますdbo.[SB$Objective Comment]にコピーしてください。

select 1 
from [dbo].[comments] cc 
    join c0_intranet.dbo.users u1 on u1.user_id = cc.user_id 
    left outer join dbo.[SB$Objective Comment] oc on oc.[No_] = cc.comment_id and CONVERT(int, oc.[Employee No_] = u1.employee_no 
where oc.[No_] is null 
+0

いいえ、動作しません。お疲れ様でした。 –

0

私はあなたのアプローチがここで間違っていると思うし、プロシージャではなくトリガーを調べるべきです。具体的には、コメントに6行を挿入し、プロシージャを実行した後、別の行をコメントに挿入してから別のプロシージャを実行したと思います。問題は、最初の呼び出しで存在テストが失敗する(つまり存在しない)ため、コメントが挿入されることです。 2番目の呼び出しでは、存在テストが合格(6つのレコードが存在する)なので、挿入は行われません。この手続きでは、何が挿入されたのかを知ることができません。その理由は、挿入されたものを知っているトリガーがコメントに挿入するための適切な存在テストと共に私の選択になるからです。

+0

あなたは正しいです、私は別の方法でこれを解決することにしました。私はMERGEコマンドを使用していますので、現在動作しています。 –

関連する問題