2017-09-06 1 views
0

Ich habe ein Problem mit einer gespeicherten SQL Server-Prozedur. Ich versuche zu überprüfen, ob in beiden Tabellen bereits Daten mit derselben ID vorhanden sind.Wenn nicht vorhanden funktioniert nicht richtig

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 

Wenn es zum ersten Mal ausgeführt wird, gibt es keine Daten in der zweiten Tabelle und es funktioniert, nachdem ich einen anderen Datensatz in der ersten Tabelle hinzufügen es nicht es in die zweite Tabelle einfügen, aber es gibt keine Fehler.

This is when I execute the procedure inside exists

This is data from table comments

+1

Welche DBMS verwenden Sie? (Dieser Code ist produktspezifisch.) – jarlh

+0

sql 2012. Es ist produktspezifisch. Ich habe ein Problem in existiert Teil meines Verfahrens. Und ich kann nicht konfigurieren, warum –

+1

Welche Datensätze sehen Sie, wenn Sie nur diese SELECT-Anweisung ausführen, die innerhalb der EXISTS ist? –

Antwort

0

Wenn ich Ihre Logik richtig rekonstruiert, diese Abfrage gleich bei Ihnen:

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 

und wenn ja, wird es immer Zeilen zurück, wenn es irgendwelche Daten bereits kopiert zu dbo.[SB$Objective Comment], versuchen Sie, mit diesem zu ersetzen:

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

Nein, es funktioniert nicht. Danke für Ihre Bemühungen. –

0

Ich denke, Ihre Herangehensweise ist hier falsch und Sie sollten eher einen Auslöser als eine Prozedur betrachten. Ich glaube, Sie haben 6 Zeilen in Kommentare eingefügt, die Prozedur ausgeführt und dann eine weitere Zeile in Kommentare eingefügt und dann eine weitere Ausführung der Prozedur. Das Problem ist, dass der exists-Test beim ersten Aufruf fehlschlägt (dh er existiert nicht), sodass ein Kommentar eingefügt wird. Beim zweiten Aufruf wird der Test bestanden (es existieren 6 Datensätze), so dass die Einfügung nicht erfolgt. Die Prozedur kann nicht wissen, was in Kommentare eingefügt wurde, weshalb ein Trigger (der weiß, was eingefügt wurde) meine Wahl zusammen mit einem geeigneten exist-Test zum Einfügen in einen Kommentar ist.

+0

Sie haben Recht, ich habe beschlossen, dies auf einem anderen Weg zu lösen. Ich habe einen MERGE-Befehl verwendet, damit er jetzt funktioniert. –

Verwandte Themen