2017-10-17 13 views
0

Nous avons un système CRM utilisant SQL Server et cherchons à remplir tous les clients avec une adresse e-mail, même si cette adresse email est NULL.Insertion dépendante avec sélection de plusieurs lignes

Il existe une table Client, une table pour les adresses e-mail et une table Linker.

je peux effectuer une requête SELECT pour tous les clients qui ont besoin d'une nouvelle ligne Email:

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

et je peux effectuer les INSERT déclarations pour ajouter une adresse e-mail à un client:

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 
) 

Existe-t-il un moyen de les combiner en une seule instruction SQL sans devoir utiliser un outil externe? Je peux écrire un programme Python rapide pour ce faire, mais les personnes qui maintiennent ce long terme sont axées sur SQL.

Le plus loin que j'ai est la combinaison SELECT avec le INSERT pour l'e-mail, mais ne pouvait pas comprendre comment puis INSERT la ligne de liaison:

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 
) 

Répondre

2

Est-ce que ce travail pour la deuxième partie?

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

Malheureusement non. Je reçois "syntaxe incorrecte près de 'cteX'." revenu. A également dû ajouter les lignes DECLARE et EXEC. Cela n'a qu'un seul INSERT sur les deux et ne récupère pas les ID requis des procédures stockées EXEC. – Metalshark

+0

J'ai mis à jour la réponse, la syntaxe incorrecte nouvelle cteX était due à l'absence de demi-côlon –

+0

J'ai encore du travail à faire pour que cela fonctionne, mais ce travail supplémentaire n'a pas été couvert par cette question. Votre solution fonctionne pour ce qui a été demandé. par exemple. devez 'EXEC' la procédure stockée pour chaque itération. – Metalshark