【问题标题】:Dependent Insert with Multi Row Select多行选择的从属插入
【发布时间】:2018-03-28 21:40:37
【问题描述】:

我们有一个使用 SQL Server 的 CRM 系统,并希望使用电子邮件地址填充所有客户,即使该电子邮件地址为 NULL。

有一个客户表、一个电子邮件地址表和一个链接器表。

我可以为所有需要新电子邮件行的客户执行SELECT 查询:

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
)

有没有一种方法可以将它们组合成一个大的 SQL 语句而无需使用外部工具?我可以编写一个快速的 Python 程序来执行此操作,但长期维护此程序的人专注于 SQL。

我得到的最远的是将SELECTINSERT 结合起来作为电子邮件,但无法弄清楚如何然后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
)

【问题讨论】:

    标签: sql sql-server select insert bulkinsert


    【解决方案1】:

    这对第二部分有用吗?

    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
    

    【讨论】:

    • 很遗憾没有。我得到“'cteX' 附近的语法不正确。”回来。还必须添加 DECLARE 和 EXEC 行。这两个中只有一个 INSERT,并且没有从 EXEC 存储过程中获取所需的 ID。
    • 我已经更新了答案,不正确的语法 new cteX 是由于缺少分号
    • 我还有一些工作要做才能让这个工作正常进行,但是这个问题没有涵盖额外的工作。您的解决方案适用于所要求的内容。例如每次迭代都必须EXEC存储过程。
    • @Metalshark 很高兴能帮上忙
    猜你喜欢
    • 2017-08-30
    • 2014-05-05
    • 2011-07-19
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多