2017-10-17 9 views
0

우리는 SQL Server를 사용하는 CRM 시스템을 보유하고 있으며 해당 전자 메일 주소가 NULL 인 경우에도 모든 고객에게 전자 메일 주소를 채우려합니다.다중 행 선택이 포함 된 종속 삽입

고객 테이블, 전자 메일 주소 용 테이블 및 링커 테이블이 있습니다.

SELECT @CompanyId = Comp_CompanyId 
FROM Company 
WHERE Company.Comp_CompanyId NOT IN (
    SELECT ELink_RecordID 
    FROM EmailLink 
) 

와 내가 고객에게 이메일 주소를 추가 할 INSERT 문을 수행 할 수 있습니다 :

DECLARE @EmailId int 
DECLARE @ELinkId int 

EXEC @ELinkId = eware_get_identity_id 'Email' 
EXEC @EmailId = eware_get_identity_id 'Email' 

INSERT INTO Email (
    Emai_EmailId, 
    Emai_CreatedBy, 
    Emai_CreatedDate, 
    Emai_UpdatedBy, 
    Emai_UpdatedDate, 
    Emai_TimeStamp, 
    Emai_EmailAddress 
) 
VALUES (
    @EmailId, 
    1, 
    GETDATE(), 
    1, 
    GETDATE(), 
    GETDATE(), 
    NULL 
) 
INSERT INTO EmailLink(
    ELink_LinkID, 
    ELink_CreatedBy, 
    ELink_CreatedDate, 
    ELink_UpdatedBy, 
    ELink_UpdatedDate, 
    ELink_TimeStamp, 
    ELink_EntityID, 
    ELink_RecordID, 
    ELink_Type, 
    ELink_EmailId 
) 
VALUES(
    @ELinkId, 
    1, 
    GETDATE(), 
    1, 
    GETDATE(), 
    GETDATE(), 
    5,   -- Person is 13, Company is 5 
    COMPANY_ID_GOES_HERE, 
    'Business', 
    @EmailId 
) 

나는 새로운 이메일 행을 필요로하는 모든 고객을위한 SELECT 쿼리를 수행 할 수 있습니다 외부 도구를 사용하지 않고 하나의 큰 SQL 문으로 결합 할 수있는 방법이 있습니까? 이를 위해 빠른 파이썬 프로그램을 작성할 수 있지만 장기간 유지하는 사람들은 SQL에 중점을 둡니다.

내가 이메일에 대한 INSERTSELECT 결합되어있어,하지만 알아낼 수없는 먼 어떻게 '에 다음 INSERT 링커 행 :

DECLARE @CompanyId int 
DECLARE @EmailId int 
DECLARE @ELinkId int 

EXEC @ELinkId = eware_get_identity_id 'Email' 
EXEC @EmailId = eware_get_identity_id 'Email' 

INSERT INTO Email (
    Emai_EmailId, 
    Emai_CreatedBy, 
    Emai_CreatedDate, 
    Emai_UpdatedBy, 
    Emai_UpdatedDate, 
    Emai_TimeStamp, 
    Emai_EmailAddress 
) 
VALUES (
    @EmailId, 
    1, 
    GETDATE(), 
    1, 
    GETDATE(), 
    GETDATE(), 
    NULL 
) 

SELECT @CompanyId = Comp_CompanyId 
FROM Company 
WHERE Company.Comp_CompanyId NOT IN (
    SELECT ELink_RecordID 
    FROM EmailLink 
) 

답변

2

윌 두 번째 부분이 작동합니까?

DECLARE @CompanyId int 
DECLARE @EmailId int 
DECLARE @ELinkId int 

EXEC @ELinkId = eware_get_identity_id 'Email' 
EXEC @EmailId = eware_get_identity_id 'Email' 

INSERT INTO Email (
    Emai_EmailId, 
    Emai_CreatedBy, 
    Emai_CreatedDate, 
    Emai_UpdatedBy, 
    Emai_UpdatedDate, 
    Emai_TimeStamp, 
    Emai_EmailAddress 
) 
VALUES (
    @EmailId, 
    1, 
    GETDATE(), 
    1, 
    GETDATE(), 
    GETDATE(), 
    NULL 
) 
;WITH cteX 
AS(
    SELECT CompanyId = Comp_CompanyId 
    FROM Company 
    WHERE Company.Comp_CompanyId 
    NOT IN (
      SELECT ELink_RecordID 
      FROM EmailLink 
      ) 
) 
INSERT INTO EmailLink(
    ELink_LinkID, 
    ELink_CreatedBy, 
    ELink_CreatedDate, 
    ELink_UpdatedBy, 
    ELink_UpdatedDate, 
    ELink_TimeStamp, 
    ELink_EntityID, 
    ELink_RecordID, 
    ELink_Type, 
    ELink_EmailId 
) 
SELECT 
    @ELinkId, 
    1, 
    GETDATE(), 
    1, 
    GETDATE(), 
    GETDATE(), 
    5,   -- Person is 13, Company is 5 
    X.CompanyId, --COMPANY_ID_GOES_HERE, 
    'Business', 
    @EmailId 
FROM 
    cteX X 
+0

불행히도. 나는 "cteX 근처에 잘못된 구문이 있습니다." 반환되었습니다. 또한 DECLARE 및 EXEC 라인을 추가해야했습니다. INSERT는 둘 중 하나만 있으며 EXEC 저장 프로 시저에서 필요한 ID를 가져 오지 않습니다. – Metalshark

+0

대답을 업데이트했습니다. 잘못된 구문입니다. 새 cteX는 세미 콜론이 누락되어 있기 때문입니다. –

+0

이 작업을 수행하는 데 필요한 작업이 아직 있지만이 추가 작업은이 질문에 포함되지 않았습니다. 귀하의 솔루션은 요구 된 것에 대해 효과가 있습니다. 예 : 각 반복마다 저장 프로 시저를 'EXEC'해야합니다. – Metalshark