KingswaySoft中ntext类型邮件字段映射及GUID不匹配问题求助
解决KingswaySoft SSIS迁移Dynamics CRM邮件实体GUID不匹配问题
问题核心
源Dynamics CRM邮件实体的To/From/Bcc/Cc字段为ntext类型,存储的是包含源系统用户/联系人GUID的XML结构。目标系统中对应记录的GUID与源系统不一致,直接映射会导致目标邮件关联无效的收件人/发件人。
分步解决方案
1. 解析ntext字段中的源GUID
Dynamics CRM邮件的收件人字段XML格式示例:
{SOURCE-GUID} 1
使用以下方式提取源GUID:
- KingswaySoft XML Extractor组件:指定XPath表达式
//partyid/text(),批量提取字段内所有源GUID。 - SSIS派生列:用内置XPath函数直接解析,示例表达式:
XPath(To, "//partyid/text()")
2. 构建源-目标GUID映射表
通过唯一业务标识(如邮箱地址、全名)匹配源和目标系统的用户/联系人,生成GUID对应关系:
- 用KingswaySoft的Dynamics CRM Source组件分别拉取源系统的
systemuser/contact实体(需包含systemuserid/contactid、emailaddress1字段)。 - 用SSIS的Lookup组件,以
emailaddress1为匹配键,关联目标系统的systemuser/contact数据,输出源GUID -> 目标GUID的映射关系,可存储到内存字典或临时表。
3. 替换GUID并重构ntext字段
将原始ntext字段中的所有源GUID替换为目标系统对应GUID,重新组装符合要求的XML结构:
- 使用SSIS脚本组件(C#)批量替换,示例代码:
// 提前加载映射字典(可从变量或临时表读取) private Dictionary<string, string> _guidMapping; public override void PreExecute() { base.PreExecute(); _guidMapping = (Dictionary<string, string>)Variables.GuidMappingDict; } public override void Input0_ProcessInputRow(Input0Buffer Row) { string originalContent = Row.OriginalToField; foreach (var pair in _guidMapping) { // 匹配带大括号的完整GUID,避免部分字符串匹配 originalContent = originalContent.Replace($"{{{pair.Key}}}", $"{{{pair.Value}}}"); } Row.ProcessedToField = originalContent; }
4. 映射到目标系统
将处理后的ntext字段直接映射到目标Dynamics CRM邮件实体的To/From/Bcc/Cc字段,使用KingswaySoft的Dynamics CRM Destination组件,确保字段数据类型设置为ntext。
注意事项
- 处理多收件人场景:单个字段可能包含多个
<activityparty>节点,需确保所有源GUID都被替换。 - 匹配键选择:优先使用全局唯一的业务标识(如邮箱),避免用全名等可能重复的字段导致匹配错误。
- 测试验证:先迁移少量样本数据,检查目标邮件的收件人/发件人是否正确关联到目标系统的记录。
内容的提问来源于stack exchange,提问作者aleeha maher
相关产品推荐
相关产品推荐

