2016-10-14 2 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 

Что я пытаюсь сделать, это добавить работу сотрудников электронной почты на primaryemail. Но если у них уже есть личный адрес электронной почты, я хочу сначала перенести это на вторичную почту. Но только для указанного сотрудника, следовательно, PersonID.Struggling with IF statement SQL Beginner

Я рассмотрел множество разных примеров, используя CASE и IF-THEN. Я думаю, что я слишком много добавляю к заявлению. Я действительно думал, что этот Stackoverflow queston поможет. Я знаю, что это будет синтаксис или как он структурирован.

+0

Что именно ваш вопрос? Вы просто хотите немного поправить свое заявление? –

+0

Покажите нам пример данных строки до и после. Очень маловероятно, что вам нужна конструкция цикла или if/else. –

+0

Я предполагаю, что вы делаете цикл над этим кодом, где вы устанавливаете значение переменных '@ personID' и' @ email', правильно? Можете ли вы опубликовать остальную часть кода? Я уверен, что это можно упростить, и можно использовать подход на основе набора, поскольку в настоящее время это не очень хорошее использование SQL (я склонен сказать, что это на самом деле 'T-SQL' /' SQL Server' , isnt 'it?) –

ответ

0

Не могли бы вы можете сделать это с помощью обновления 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

Это выглядит очень хорошо, и мне нравится логика, я знал, что моя была ужасной. Я получаю сообщение об ошибке, хотя с случаем SET Email, когда адрес электронной почты равен нулю, а затем @email. SET говорит «неправильный синтаксис рядом с SET, ожидающим CONVERSATION». Как и ГДЕ на WHERE personID. –

+0

@JoshuaBarrett это beacuse вы используете SQL VARS '@email' .. и '@personID' я aheb обновить asnwer с образцом – scaisEdge

+0

UPDATE dbo.Contact SET emailMessenger = '63' WHERE PersonId = '18403' UPDATE dbo.Contact SET SecondaryEmail = СЛУЧАЙ, когда почта не равно нулю, то электронная почта еще SecondaryEmail конец WHERE PersonId = '3' UPDATE dbo.Contact SET Email = СЛУЧАЙ, когда электронная почта является нулевым, тогда '[email protected]' когда электронная почта <> 'studentemail.com' then '[email protected]' еще адрес электронной почты WHERE personID = '3' –

0

Если я правильно следуя вашей логике, следующий должен сделать трюк.

Сначала я установил таблицу тестирования со всеми возможными перестановками проблем (электронная почта присутствует в одном или обоих столбцах). Если ваши данные не выглядят примерно так, мое решение может не применяться.

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') 

И для того, чтобы внести изменения, которые необходимо внести, показать содержимое до, внести изменения, а затем показать содержимое после.

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 

Чистый результат: @email всегда устанавливается в столбце Email и @SecondaryEmail устанавливается на содержание электронной почты, только если почта не была нулевой

+0

И вы можете добавить ', emailMessenger = 63' в оператор Update, хотя, вероятно, это тоже должен быть параметр (?) –