2017-10-17 3 views
0

Wir haben ein CRM-System mit SQL Server und suchen, um alle Kunden mit einer E-Mail-Adresse zu füllen, auch wenn diese E-Mail-Adresse NULL ist.Abhängige Einfügen mit Multi Row Wählen Sie

Es gibt eine Kundentabelle, eine Tabelle für E-Mail-Adressen und eine Linkertabelle.

kann ich eine SELECT Abfrage für alle Kunden durchführen, die eine neue E-Mail-Reihe benötigen:

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

und ich kann die INSERT Aussagen führen Sie eine E-Mail-Adresse an einen Kunden hinzuzufügen:

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 
) 

Gibt es eine Möglichkeit, diese zu einer großen SQL-Anweisung zu kombinieren, ohne ein externes Tool verwenden zu müssen? Ich kann dafür ein schnelles Python-Programm schreiben, aber die Leute, die dies langfristig tun, sind SQL-fokussiert.

Die am weitesten, was ich habe ist die SELECT mit dem INSERT für die E-Mail-Kombination, aber konnte nicht herausfinden, wie man dann INSERT der Linker Reihe:

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 
) 

Antwort

2

Wird diese Arbeit für den zweiten Teil?

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

Leider nicht. Ich bekomme "Falsche Syntax in der Nähe von 'cteX'." ist zurückgekommen. Außerdem mussten die DECLARE- und EXEC-Zeilen hinzugefügt werden. Das hat nur einen INSERT von den beiden und greift nicht auf die IDs, die von den gespeicherten EXEC-Prozeduren benötigt werden. – Metalshark

+0

Ich habe die Antwort aktualisiert, die falsche Syntax neue CteX wurde aufgrund fehlender Semikolon –

+0

Ich habe noch etwas Arbeit zu tun, um dies funktioniert, aber diese zusätzliche Arbeit wurde nicht durch diese Frage abgedeckt. Ihre Lösung funktioniert für das, was Sie gefragt haben. z.B. muss die gespeicherte Prozedur für jede Iteration "EXEC" ausführen. – Metalshark