2016-10-14 1 views
1
UPDATE dbo.Contact 
SET emailMessenger = '63' WHERE personID = @personID 
WHILE (SELECT Email FROM Contact WHERE personID = @personID) != @email 
BEGIN 
    IF (SELECT Email FROM Contact WHERE personID = @personID) IS NULL 
     UPDATE Contact SET Email = @personID WHERE personID = @personID 
    ELSE IF (SELECT Email FROM Contact WHERE personID = @personID) IS NOT NULL 
     UPDATE Contact SET SecondaryEmail = email WHERE personID = @personID 
     UPDATE Contact SET email = @email WHERE personID = @personID 
END 

Ce que j'essaie de faire est d'ajouter un email de travail des employés à primaryemail. Mais s'ils ont déjà un e-mail personnel, je veux d'abord le déplacer vers le secondaire. Mais seulement pour l'employé spécifié d'où le PersonID.Lutte avec l'instruction IF SQL Débutant

J'ai regardé beaucoup d'exemples différents en utilisant CASE et IF-THEN. Je pense que j'ajoute trop à la déclaration. Je pensais vraiment que Stackoverflow queston aiderait. Je sais que ça va être la syntaxe ou comment elle est structurée.

+0

Quel est exactement votre question? Vous voulez juste nettoyer un peu votre déclaration? –

+0

Montrez-nous quelques exemples de données de ligne avant et après. Il est hautement improbable que vous ayez besoin d'une construction en boucle ou si/sinon. –

+0

Je suppose que vous faites une boucle au-dessus de ce code où vous définissez la valeur des variables '@ personID' et' @ email', correct? Pouvez-vous poster le reste du code? Je suis assez sûr que cela peut être simplifié et une approche basée sur un ensemble peut être utilisée, car actuellement ce n'est pas un très bon usage de SQL (je suis enclin à dire qu'il est en fait 'T-SQL' /' SQL Server' , n'est pas 'il?) –

Répondre

0

Pourriez-vous peut le faire avec un déclencheur de mise à jour avoding

UPDATE dbo.Contact 
SET emailMessenger = '63', 
    dbo.Contact, 
    SecondaryEmail = CASE when Email is not null then Email else SecondaryEmail end , 
     Email = CASE when email is null then 'studentemail.com' 
      when email <>'studentemail.com' then 'studentemail.com' else  email end 
where personID = '18403'; 
+0

Cela semble très bon et j'aime la logique, je savais que le mien était horrible. J'obtiens cependant une erreur avec le cas SET Email quand email est nul alors @email. SET indique "syntaxe incorrecte près de SET attendant la CONVERSATION". Comme le WHERE sur WHERE personID. –

+0

@JoshuaBarrett ce beacuse vous utilisez de la @Email 'sql vars .. et '@personID' i AHEB mettre à jour le asnwer avec un échantillon – scaisEdge

+0

MISE À JOUR dbo.Contact SET emailMessenger = '63' OÙ personID = '18403' MISE À JOUR dbo.Contact SET SecondaryEmail = CASE lorsque email est non nul alors d'autre SecondaryEmail Envoyer fin oÙ personID = '3' MISE À JOUR dbo.Contact SET email = CASE lorsque le courrier électronique est nULL, '[email protected]' lorsque le courrier électronique <> 'studentemail.com' puis '[email protected]' autre adresse e-mail fin O person personID = '3' –

0

Si je suis bien suivant votre logique, ce qui suit devrait faire l'affaire.

J'ai d'abord mis en place une table de test avec toutes les permutations de problèmes possibles (email présent dans une, les deux, ou aucune des deux colonnes). Si vos données ne ressemblent pas à ceci, ma solution peut ne pas s'appliquer.

drop table Contact 

CREATE TABLE Contact 
(
    PersonId  int   not null 
    ,Email   varchar(100) null 
    ,SecondaryEmail varchar(100) null 
) 

INSERT Contact values 
    (1, null, null) 
,(2, 'OnlyFirst', null) 
,(3, null, 'OnlySecond') 
,(4, 'FirstEmail', 'SecondEmail') 

Et ce qui suit pour définir la modification à effectuer, afficher le contenu avant, effectuer la modification, puis afficher le contenu après.

DECLARE 
    @PersonId int 
,@Email  varchar(100) = '[email protected]' 

SET @PersonId = 4 

-- Before 
SELECT * from Contact 

-- Modify 
UPDATE Contact 
set 
    Email   = @Email 
    ,SecondaryEmail = case when Email is not null then Email else SecondaryEmail end 
where PersonID = @PersonID 

-- After 
SELECT * from Contact 

Résultat net: @Email est toujours situé dans e-mail de colonne et @SecondaryEmail est réglé sur le contenu du courrier électronique que si courriel n'a pas été nulle

+0

Et vous pouvez ajouter ', emailMessenger = 63' à l'instruction de mise à jour, bien que probablement aussi devrait être un paramètre (?) –