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 

내가하려고하는 것은 직원 업무용 전자 메일을 기본 전자 메일에 추가하는 것입니다. 그러나 이미 개인 이메일을 가지고 있다면 먼저 보조 이메일로 옮기고 싶습니다. 그러나 지정된 직원 만 따라서 PersonID.IF 문으로 고생 SQL 초급

저는 CASE와 IF-THEN을 사용하여 여러 가지 다른 예를 살펴 보았습니다. 나는 진술에 너무 많이 추가하고 있다고 생각한다. 정말이 Stackoverflow queston 도움이 될 줄 알았는데. 문법이나 구조가 어떻게되는지 알고 있습니다. 내가 제대로 논리를 다음과 같은거야 경우

+0

정확히 질문은 무엇입니까되지 않은 경우에만 이메일의 내용에 항상 열 이메일에 설정되고, @SecondaryEmail이 설정되어 있습니까? 당신은 진술을 약간 정리하고 싶습니까? –

+0

몇 가지 예제 행 데이터를 표시하십시오. 루프 구조 나 if/else가 필요하지는 않습니다. –

+0

당신이'@ personID'와'@ email' 변수의 값을 설정하고있는이 코드 위에 루프를 돌리고 있다고 가정합니다. 맞습니까? 나머지 코드를 게시 할 수 있습니까? 나는 이것을 단순화 할 수 있고 set-based 접근법을 사용할 수 있다고 확신한다. 왜냐하면 현재 이것은 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 E-mail로 이메일이 null 일 때 @email 일 경우 오류가 발생합니다. SET는 "CONVERSATION을 예상하는 SET 근처의 구문이 올바르지 않습니다"라고 말합니다. WHERE where personID는 어디에서와 마찬가지입니다. –

+0

@JoshuaBarrett이 당신은 SQL 바르 '@ 이메일'..을 사용하고 '@personID'내가 샘플 – scaisEdge

+0

UPDATE dbo.Contact SET emailMessenger = '63' personID = '18403' 업데이트로 asnwer를 업데이트 aheb beacuse dbo.Contact SET SecondaryEmail 리스팅 다음 을 종료 SecondaryEmail 다른 이메일 null가 아닌 = CASE WHERE 이메일 다음 '[email protected]' 이메일 null의 personID = '3' UPDATE dbo.Contact SET 이메일 = CASE <> 'studentemail.com'then '[email protected]'그렇지 않으면 이메일 끝 어디 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 

최종 결과 : @ 이메일이 이메일이 null

+0

그리고', emailMessenger = 63'을 Update 문에 추가 할 수 있습니다. 아마도 매개 변수 (?) 여야합니다. –