【问题标题】:Trigger to update a linked server name record when specific values are enterred in status在状态中输入特定值时触发更新链接服务器名称记录
【发布时间】:2017-01-11 19:43:54
【问题描述】:

数据库 Sql server 2008R

我正在同步两个独立的数据库应用程序。数据库是链接服务器。一种是CRM,一种是ERP。当用户在 CRM 的 Names 表 Status 列中输入两个代码字符串之一时,ERP 的 Names 表记录需要使用来自 CRM 的名称记录进行更新。

VN=供应商 CO=联系方式

客户关系管理

+-------+-------+-----------+--------+-----------+------------+----------+--------+
| Names | Table | ContactID | TypeID | FirstName | MiddleName | LastName | Status |
+-------+-------+-----------+--------+-----------+------------+----------+--------+

用户在状态中输入(2 个代码中的 1 个)VN、CO

企业资源规划

+-------+-------+-----------+--------+-----------+------------+----------+
| Names | Table | ContactID | TypeID | FirstName | MiddleName | LastName |
+-------+-------+-----------+--------+-----------+------------+----------+

来自CRM的姓名记录需要更新ERP的姓名记录

好像是这样的:

UPDATE n
    case i.Status
        when 'WO' then SET ERP.FirstName = i.FirstName, ERP.MiddleName = i.MiddleName, ERP.LastName = i.LastName
from inserted I
        when 'PN' then SET ERP.FirstName = i.FirstName, ERP.MiddleName = i.MiddleName, ERP.LastName = i.LastName
     end
from inserted i
INNER JOIN CRM.dbo.Names n on n.CompanyID = i.CompanyID

【问题讨论】:

    标签: sql-server triggers sql-update linked-server


    【解决方案1】:

    没有。这不是 case 表达式的工作方式。 case 表达式用于控制单个列的值。您需要更新多个列。使用我在您之前关于此主题的问题中发布的代码,您只需要像这样添加三个新列。

    UPDATE p
    SET Status = 
        case i.Status when 'CN' then'Converted'
            when 'WO' then 'Working'
            when 'PN' then 'Pending'
        end
        , FirstName = i.FirstName
        , MiddleName = i.MiddleName
        , LastName = i.LastName
    from inserted i
    INNER JOIN CRM.dbo.Projects p on p.ProjectID = i.QuoteID
    

    --编辑--

    根据您最近的 cmets,我认为您可能想要一些类似的东西。请注意,在 case 表达式中添加了 else 谓词。

    UPDATE p
    SET Status = 
        case i.Status when 'CN' then'Converted'
            when 'WO' then 'Working'
            when 'PN' then 'Pending'
            else p.Status
        end
        , FirstName = i.FirstName
        , MiddleName = i.MiddleName
        , LastName = i.LastName
    from inserted i
    INNER JOIN CRM.dbo.Projects p on p.ProjectID = i.QuoteID
    

    【讨论】:

    • 感谢您的解释。只有当用户在状态栏中输入 VN 或 CO 时,名称记录才需要更新。有没有办法将它添加到查询中?
    • 嗯...如果您只想在值为 VN 或 CO 时发生,您对状态有何期望?您应该能够轻松地修改代码以适应两个不同的值。
    • 我可以想象如何用几列更新名称记录,但如果只更新一个列,可能是两个不同的开始,结束块。更新名称 SET name.FirstName = Inserted.FirstName, name.MiddleName = Inserted.MiddleName, name.LastName = inserted.LastName ... FROM 插入,名称 WHERE inserted.contactid= name.contactid AND inserted.status = 'VN' 或插入的.status = 'CO'
    • 不太清楚你在这里的意思。看来你需要一些额外的逻辑我只是不知道你需要什么。除此之外,您确实应该养成使用显式连接而不是逗号分隔的表列表的习惯。这样做太容易犯错误了。 sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/…
    • 也许您只需要在 case 表达式中添加一个 else,这样如果插入的状态不是 CN、WO 或 PN,您只需将状态设置为 p.Status(这意味着它不会改变)?
    猜你喜欢
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 2017-08-20
    • 2015-09-25
    • 1970-01-01
    • 2016-06-08
    • 2021-04-07
    • 1970-01-01
    相关资源
    最近更新 更多