2010-04-15 1 views
0

Veuillez pardonner mon ignorance et mes faibles compétences en programmation SQL, mais je suis normalement un développeur SQL de base.Utilisation d'une instruction Case dans la section values ​​d'une instruction Insert

J'ai besoin de créer un déclencheur hors de l'insertion de données dans une table pour insérer des données différentes dans une autre table.

Dans ce déclencheur, j'ai besoin d'insérer certaines données dans la nouvelle table en fonction des valeurs dans les données nouvellement insérées de la table d'origine. Je suis totalement confus à ce sujet. Je pensais que je serais créatif et utiliserais une déclaration de cas dans la section Valeurs, mais ça ne fonctionne pas.

Quelqu'un peut-il m'aider s'il vous plaît à ce sujet? (Ci-dessous est le code pour le déclencheur que j'ai dès maintenant)

INSERT INTO dbo.WebOnlineUserPeopleDashboard 
    (
     ONLINE_USERACCOUNT_ID, 
     ONLINE_ROOMS_DIRECTORY, 
     ONLINE_ROOMS_LIST, 
     ONLINE_ROOMS_PLACEMENT, 
     ONLINE_ROOMS_MANAGEMENT, 
     ONLINE_MAILINGLIST_DIRECTORY, 
     ONLINE_MAILINGLIST_LIST, 
     ONLINE_MAILINGLIST_MEMBERS, 
     ONLINE_MAILINGLIST_MANAGER, 
     ONLINE_PEOPLESEARCH_DIRECTORY 
    ) 
VALUES 
    IF (SELECT ONLINE_PEOPLE_FULL_ACCESS FROM INSERTED) = 1 
     BEGIN 
      SELECT 
       ONLINE_USERACCOUNT_ID, 
       1, 
       1, 
       1, 
       1, 
       1, 
       1, 
       1, 
       1, 
       1 
      FROM INSERTED 
     END 
    ELSE IF (SELECT ONLINE_PEOPLE_FULL_ACCESS FROM INSERTED) = 0 
     BEGIN 
      SELECT 
       ONLINE_USERACCOUNT_ID, 
       0, 
       0, 
       0, 
       0, 
       0, 
       0, 
       0, 
       0, 
       0 
      FROM INSERTED 
     END 
    ELSE 
     BEGIN 
      SELECT 
       ONLINE_USERACCOUNT_ID, 
       CASE --DIRECTORY 
        WHEN ONLINE_PEOPLE_ROOMS_PLACEMENT_FULL_ACCESS = 1 OR ONLINE_PEOPLE_ROOMS_PLACEMENT_VIEW = 1 OR ONLINE_PEOPLE_ROOMS_PLACEMENT_ADD = 1 OR ONLINE_PEOPLE_ROOMS_PLACEMENT_UPDATE = 1 OR ONLINE_PEOPLE_ROOMS_PLACEMENT_DELETE = 1 
         THEN 1 
        WHEN ONLINE_PEOPLE_ROOMS_PLACEMENT_FULL_ACCESS = 0 
         THEN 0 
       END, 
       CASE 
        WHEN ONLINE_PEOPLE_ROOMS_PLACEMENT_VIEW = 1 
         THEN 1 
        WHEN ONLINE_PEOPLE_ROOMS_PLACEMENT_VIEW = 0 
         THEN 0 
       END, 
       CASE 
        WHEN ONLINE_PEOPLE_ROOMS_PLACEMENT_ADD = 1 OR ONLINE_PEOPLE_ROOMS_PLACEMENT_UPDATE = 1 OR ONLINE_PEOPLE_ROOMS_PLACEMENT_DELETE = 1 
         THEN 1 
        WHEN ONLINE_PEOPLE_ROOMS_PLACEMENT_ADD = 0 AND ONLINE_PEOPLE_ROOMS_PLACEMENT_UPDATE = 0 AND ONLINE_PEOPLE_ROOMS_PLACEMENT_DELETE = 0 
         THEN 0 
       END, 
       CASE 
        WHEN ONLINE_PEOPLE_ROOMS_MANAGEMENT_FULL_ACCESS = 1 
         THEN 1 
        WHEN ONLINE_PEOPLE_ROOMS_MANAGEMENT_FULL_ACCESS = 0 
         THEN 0 
       END, 
       CASE 
        WHEN ONLINE_PEOPLE_MAILING_LISTS_FULL_ACCESS = 1 OR ONLINE_PEOPLE_MAILING_LISTS_VIEW = 1 OR ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_ADD = 1 OR ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_UPDATE = 1 OR ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_DELETE = 1 
         THEN 1 
        WHEN ONLINE_PEOPLE_MAILING_LISTS_FULL_ACCESS = 0 
         THEN 0 
       END, 
       CASE 
        WHEN ONLINE_PEOPLE_MAILING_LISTS_VIEW = 1 
         THEN 1 
        WHEN ONLINE_PEOPLE_MAILING_LISTS_VIEW = 0 
         THEN 0 
       END, 
       CASE 
        WHEN ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_ADD = 1 OR ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_UPDATE = 1 OR ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_DELETE = 1 
         THEN 1 
        WHEN ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_ADD = 0 AND ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_UPDATE = 0 AND ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_DELETE = 0 
         THEN 0 
       END, 
       CASE 
        WHEN ONLINE_PEOPLE_MAILING_LISTS_ADD = 1 OR ONLINE_PEOPLE_MAILING_LISTS_UPDATE = 1 OR ONLINE_PEOPLE_MAILING_LISTS_DELETE = 1 
         THEN 1 
        WHEN ONLINE_PEOPLE_MAILING_LISTS_ADD = 1 OR ONLINE_PEOPLE_MAILING_LISTS_UPDATE = 1 OR ONLINE_PEOPLE_MAILING_LISTS_DELETE = 1 
         THEN 0 
       END, 
       CASE 
        WHEN ONLINE_PEOPLE_PEOPLE_SEARCH = 1 
         THEN 1 
        WHEN ONLINE_PEOPLE_PEOPLE_SEARCH = 0 
         THEN 0 
       END 
      FROM INSERTED 
     END 
    END 
+0

** NE JAMAIS coder un déclencheur pour l'insertion unique ** il finira par vous mordre! peut-être que vous n'en insérez qu'une seule aujourd'hui, qu'en est-il dans le futur, peut-être un an pour l'instant vous aurez un script inséré un tas ou vous importerez un fichier, etc. ** votre déclencheur de réponse sélectionné n'échouera pas une erreur et une annulation, mais vous obtiendrez juste des données fausses, ce qui est bien pire! ** –

Répondre

0

Quelque chose comme ça?

IF (SELECT ONLINE_PEOPLE_FULL_ACCESS FROM INSERTED) = 1 

    INSERT INTO dbo.WebOnlineUserPeopleDashboard 
    ( 
     ONLINE_USERACCOUNT_ID, 
     ONLINE_ROOMS_DIRECTORY, 
     ONLINE_ROOMS_LIST, 
     ONLINE_ROOMS_PLACEMENT, 
     ONLINE_ROOMS_MANAGEMENT, 
     ONLINE_MAILINGLIST_DIRECTORY, 
     ONLINE_MAILINGLIST_LIST, 
     ONLINE_MAILINGLIST_MEMBERS, 
     ONLINE_MAILINGLIST_MANAGER, 
     ONLINE_PEOPLESEARCH_DIRECTORY 
    ) 
    VALUES 
    SELECT 
     ONLINE_USERACCOUNT_ID, 
     1, 
     1, 
     1, 
     1, 
     1, 
     1, 
     1, 
     1, 
     1 
    FROM INSERTED 

ELSE IF (SELECT ONLINE_PEOPLE_FULL_ACCESS FROM INSERTED) = 0 

    INSERT INTO dbo.WebOnlineUserPeopleDashboard 
    ( 
     ONLINE_USERACCOUNT_ID, 
     ONLINE_ROOMS_DIRECTORY, 
     ONLINE_ROOMS_LIST, 
     ONLINE_ROOMS_PLACEMENT, 
     ONLINE_ROOMS_MANAGEMENT, 
     ONLINE_MAILINGLIST_DIRECTORY, 
     ONLINE_MAILINGLIST_LIST, 
     ONLINE_MAILINGLIST_MEMBERS, 
     ONLINE_MAILINGLIST_MANAGER, 
     ONLINE_PEOPLESEARCH_DIRECTORY 
    ) 
    VALUES 
    SELECT 
     ONLINE_USERACCOUNT_ID, 
     0, 
     0, 
     0, 
     0, 
     0, 
     0, 
     0, 
     0, 
     0 
    FROM INSERTED 

ELSE 

    INSERT INTO dbo.WebOnlineUserPeopleDashboard 
    ( 
     ONLINE_USERACCOUNT_ID, 
     ONLINE_ROOMS_DIRECTORY, 
     ONLINE_ROOMS_LIST, 
     ONLINE_ROOMS_PLACEMENT, 
     ONLINE_ROOMS_MANAGEMENT, 
     ONLINE_MAILINGLIST_DIRECTORY, 
     ONLINE_MAILINGLIST_LIST, 
     ONLINE_MAILINGLIST_MEMBERS, 
     ONLINE_MAILINGLIST_MANAGER, 
     ONLINE_PEOPLESEARCH_DIRECTORY 
    ) 
     SELECT 
      ONLINE_USERACCOUNT_ID, 
      CASE --DIRECTORY 
       WHEN ONLINE_PEOPLE_ROOMS_PLACEMENT_FULL_ACCESS = 1 OR ONLINE_PEOPLE_ROOMS_PLACEMENT_VIEW = 1 OR ONLINE_PEOPLE_ROOMS_PLACEMENT_ADD = 1 OR ONLINE_PEOPLE_ROOMS_PLACEMENT_UPDATE = 1 OR ONLINE_PEOPLE_ROOMS_PLACEMENT_DELETE = 1 
        THEN 1 
       WHEN ONLINE_PEOPLE_ROOMS_PLACEMENT_FULL_ACCESS = 0 
        THEN 0 
      END, 
      CASE 
       WHEN ONLINE_PEOPLE_ROOMS_PLACEMENT_VIEW = 1 
        THEN 1 
       WHEN ONLINE_PEOPLE_ROOMS_PLACEMENT_VIEW = 0 
        THEN 0 
      END, 
      CASE 
       WHEN ONLINE_PEOPLE_ROOMS_PLACEMENT_ADD = 1 OR ONLINE_PEOPLE_ROOMS_PLACEMENT_UPDATE = 1 OR ONLINE_PEOPLE_ROOMS_PLACEMENT_DELETE = 1 
        THEN 1 
       WHEN ONLINE_PEOPLE_ROOMS_PLACEMENT_ADD = 0 AND ONLINE_PEOPLE_ROOMS_PLACEMENT_UPDATE = 0 AND ONLINE_PEOPLE_ROOMS_PLACEMENT_DELETE = 0 
        THEN 0 
      END, 
      CASE 
       WHEN ONLINE_PEOPLE_ROOMS_MANAGEMENT_FULL_ACCESS = 1 
        THEN 1 
       WHEN ONLINE_PEOPLE_ROOMS_MANAGEMENT_FULL_ACCESS = 0 
        THEN 0 
      END, 
      CASE 
       WHEN ONLINE_PEOPLE_MAILING_LISTS_FULL_ACCESS = 1 OR ONLINE_PEOPLE_MAILING_LISTS_VIEW = 1 OR ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_ADD = 1 OR ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_UPDATE = 1 OR ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_DELETE = 1 
        THEN 1 
       WHEN ONLINE_PEOPLE_MAILING_LISTS_FULL_ACCESS = 0 
        THEN 0 
      END, 
      CASE 
       WHEN ONLINE_PEOPLE_MAILING_LISTS_VIEW = 1 
        THEN 1 
       WHEN ONLINE_PEOPLE_MAILING_LISTS_VIEW = 0 
        THEN 0 
      END, 
      CASE 
       WHEN ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_ADD = 1 OR ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_UPDATE = 1 OR ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_DELETE = 1 
        THEN 1 
       WHEN ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_ADD = 0 AND ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_UPDATE = 0 AND ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_DELETE = 0 
        THEN 0 
      END, 
      CASE 
       WHEN ONLINE_PEOPLE_MAILING_LISTS_ADD = 1 OR ONLINE_PEOPLE_MAILING_LISTS_UPDATE = 1 OR ONLINE_PEOPLE_MAILING_LISTS_DELETE = 1 
        THEN 1 
       WHEN ONLINE_PEOPLE_MAILING_LISTS_ADD = 1 OR ONLINE_PEOPLE_MAILING_LISTS_UPDATE = 1 OR ONLINE_PEOPLE_MAILING_LISTS_DELETE = 1 
        THEN 0 
      END, 
      CASE 
       WHEN ONLINE_PEOPLE_PEOPLE_SEARCH = 1 
        THEN 1 
       WHEN ONLINE_PEOPLE_PEOPLE_SEARCH = 0 
        THEN 0 
      END 
     FROM INSERTED 
+0

Oh ok, alors utilisez une instruction IF ELSE pour encapsuler l'ensemble des instructions d'insertion. Complètement compréhensible et logique. Je vais essayer de le faire demain matin quand je serai de retour au bureau et je vous le ferai savoir. Merci beaucoup. – mattgcon

+0

Si vous insérez plusieurs lignes à la fois, ce déclencheur échouera. –

+0

Cela a parfaitement fonctionné Merci, Cette table est un processus d'insertion d'une seule rangée, donc je ne vais pas avoir à vous en soucier pour le moment. Dans mes autres tables, je devrais peut-être utiliser l'autre exemple pour les insertions de lignes multiples. – mattgcon

2

ce traitera toutes les lignes si plusieurs lignes sont affectées par le déclencheur:

INSERT INTO dbo.WebOnlineUserPeopleDashboard 
    (
     ONLINE_USERACCOUNT_ID, 
     ONLINE_ROOMS_DIRECTORY, 
     ONLINE_ROOMS_LIST, 
     ONLINE_ROOMS_PLACEMENT, 
     ONLINE_ROOMS_MANAGEMENT, 
     ONLINE_MAILINGLIST_DIRECTORY, 
     ONLINE_MAILINGLIST_LIST, 
     ONLINE_MAILINGLIST_MEMBERS, 
     ONLINE_MAILINGLIST_MANAGER, 
     ONLINE_PEOPLESEARCH_DIRECTORY 
    ) 
SELECT 
    ONLINE_USERACCOUNT_ID, 
    1, 
    1, 
    1, 
    1, 
    1, 
    1, 
    1, 
    1, 
    1 
FROM INSERTED 
WHERE ONLINE_PEOPLE_FULL_ACCESS=1 
UNION 
SELECT 
    ONLINE_USERACCOUNT_ID, 
    0, 
    0, 
    0, 
    0, 
    0, 
    0, 
    0, 
    0, 
    0 
FROM INSERTED 
WHERE ONLINE_PEOPLE_FULL_ACCESS=0 
UNION 
SELECT 
    ONLINE_USERACCOUNT_ID, 
    CASE --DIRECTORY 
     WHEN ONLINE_PEOPLE_ROOMS_PLACEMENT_FULL_ACCESS = 1 OR ONLINE_PEOPLE_ROOMS_PLACEMENT_VIEW = 1 OR ONLINE_PEOPLE_ROOMS_PLACEMENT_ADD = 1 OR ONLINE_PEOPLE_ROOMS_PLACEMENT_UPDATE = 1 OR ONLINE_PEOPLE_ROOMS_PLACEMENT_DELETE = 1 
      THEN 1 
     WHEN ONLINE_PEOPLE_ROOMS_PLACEMENT_FULL_ACCESS = 0 
      THEN 0 
     --ELSE ??? what is the default 
    END, 
    CASE 
     WHEN ONLINE_PEOPLE_ROOMS_PLACEMENT_VIEW = 1 
      THEN 1 
     WHEN ONLINE_PEOPLE_ROOMS_PLACEMENT_VIEW = 0 
      THEN 0 
     --ELSE ??? what is the default 
    END, 
    CASE 
     WHEN ONLINE_PEOPLE_ROOMS_PLACEMENT_ADD = 1 OR ONLINE_PEOPLE_ROOMS_PLACEMENT_UPDATE = 1 OR ONLINE_PEOPLE_ROOMS_PLACEMENT_DELETE = 1 
      THEN 1 
     WHEN ONLINE_PEOPLE_ROOMS_PLACEMENT_ADD = 0 AND ONLINE_PEOPLE_ROOMS_PLACEMENT_UPDATE = 0 AND ONLINE_PEOPLE_ROOMS_PLACEMENT_DELETE = 0 
      THEN 0 
     --ELSE ??? what is the default 
    END, 
    CASE 
     WHEN ONLINE_PEOPLE_ROOMS_MANAGEMENT_FULL_ACCESS = 1 
      THEN 1 
     WHEN ONLINE_PEOPLE_ROOMS_MANAGEMENT_FULL_ACCESS = 0 
      THEN 0 
     --ELSE ??? what is the default 
    END, 
    CASE 
     WHEN ONLINE_PEOPLE_MAILING_LISTS_FULL_ACCESS = 1 OR ONLINE_PEOPLE_MAILING_LISTS_VIEW = 1 OR ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_ADD = 1 OR ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_UPDATE = 1 OR ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_DELETE = 1 
      THEN 1 
     WHEN ONLINE_PEOPLE_MAILING_LISTS_FULL_ACCESS = 0 
      THEN 0 
     --ELSE ??? what is the default 
    END, 
    CASE 
     WHEN ONLINE_PEOPLE_MAILING_LISTS_VIEW = 1 
      THEN 1 
     WHEN ONLINE_PEOPLE_MAILING_LISTS_VIEW = 0 
      THEN 0 
     --ELSE ??? what is the default 
    END, 
    CASE 
     WHEN ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_ADD = 1 OR ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_UPDATE = 1 OR ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_DELETE = 1 
      THEN 1 
     WHEN ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_ADD = 0 AND ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_UPDATE = 0 AND ONLINE_PEOPLE_MAILING_LISTS_MEMBERS_DELETE = 0 
      THEN 0 
     --ELSE ??? what is the default 
    END, 
    CASE 
     WHEN ONLINE_PEOPLE_MAILING_LISTS_ADD = 1 OR ONLINE_PEOPLE_MAILING_LISTS_UPDATE = 1 OR ONLINE_PEOPLE_MAILING_LISTS_DELETE = 1 
      THEN 1 
     WHEN ONLINE_PEOPLE_MAILING_LISTS_ADD = 1 OR ONLINE_PEOPLE_MAILING_LISTS_UPDATE = 1 OR ONLINE_PEOPLE_MAILING_LISTS_DELETE = 1 
      THEN 0 
     --ELSE ??? what is the default 
    END, 
    CASE 
     WHEN ONLINE_PEOPLE_PEOPLE_SEARCH = 1 
      THEN 1 
     WHEN ONLINE_PEOPLE_PEOPLE_SEARCH = 0 
      THEN 0 
     --ELSE ??? what is the default 
    END 
FROM INSERTED 
WHERE ONLINE_PEOPLE_FULL_ACCESS NOT IN (0,1) 
Questions connexes