SQL查询来检索我想要的值,存储在一行中

SQL查询来检索我想要的值,存储在一行中,sql,migration,dynamics-crm-2011,data-migration,goldmine,Sql,Migration,Dynamics Crm 2011,Data Migration,Goldmine,我正在尝试使用海星ETL从Goldmine 5.5迁移到MCRM 2011 问题在于Goldmine数据库中有一个名为的表,其中我迁移传入电子邮件所需的所有信息都存储在一个名为rfc822(完整标题和正文消息)的行中。即使在其他表中也没有发件人/收件人/etc的行 我在ETL软件中使用此查询作为原点,从原点数据库(Goldmine)获取所需信息,但海星提供的默认地图在我的情况下不起作用 SELECT ch.*, c1.PHONE1, mb.RFC822 FROM CONTHIST ch

我正在尝试使用海星ETL从Goldmine 5.5迁移到MCRM 2011

问题在于Goldmine数据库中有一个名为的表,其中我迁移传入电子邮件所需的所有信息都存储在一个名为rfc822(完整标题和正文消息)的行中。即使在其他表中也没有发件人/收件人/etc的行

我在ETL软件中使用此查询作为原点,从原点数据库(Goldmine)获取所需信息,但海星提供的默认地图在我的情况下不起作用

SELECT  ch.*, c1.PHONE1, mb.RFC822 
FROM    CONTHIST ch 
        INNER JOIN CONTACT1 c1 
            ON ch.ACCOUNTNO=c1.ACCOUNTNO 
        INNER JOIN MAILBOX mb 
            ON ch.recid=mb.LINKRECID 
WHERE   ch.RECTYPE='MI'
之后,我可以映射目标MCRM电子邮件表并添加函数字段(vbscript、C#)

大多数情况下,一旦作业完成,发件人/收件人将恢复为错误的值(例如,“密件抄送”字段中的用户)

我想知道的是:

  • 如何提取存储在rfc822行中的CC和BCC字段
  • 有HTML和纯文本格式的电子邮件,唯一区别的方法是在这一行中查找。此外,动力学也不以相同的方式存储它
  • 如何使用SQL检索发件人和收件人
我想一定有办法用SQL查询完成这项工作。

GoldMine 5.5(!哇)-我的哀悼(事实上,你很幸运,因为在未来版本的GoldMine rfc822中,字段也被加密了)

我认为有两种方法可以解决您的问题(都需要SQL Server 2005或更高版本):

  • 与SQLCLR集成,以便能够使用正则表达式解析rfc822字段
  • 或者使用GoldMineAPI(如果您想从SQL使用GoldMineAPI,还可以与SQLCLR集成)通过业务逻辑函数获取电子邮件

  • 我有两种选择的一些例子:

    比如说,

    使用SQLCLR解析HTML的示例 我写了一次来解析GoldMine 9.0的ContHist注释

    SQLCLR函数(C#)

    用法

    select dbo.RemoveHTML(rfc822) from Mailbox
    
    public GoldMineEmails(GoldMineAPI api, DataTable mailbox)
    {
        foreach (DataRow emailRow in mailbox.Rows)
        {
            var dict = new Dictionary<string, string>(3);
            dict["MboxRecID"] = emailRow["recid"].ToString();
            dict["History"] = "1";
    
            try
            {
                var res = api.ReadMail(dict);
    
                var email = new GoldMineEmail(res["To"], res["Cc"], res["Bcc"], res["Outgoing"])
                {
                    body = res["Body"],
                    From = res["From"],
                    subject = res["Subject"],
                    user = res["User"]
                };
    
                this.Add(email);
            }
            catch
            {
                throw;
                // error logging
            }
        }
    }
    
    使用这种方法,您可以将SQLCLR函数中的正则表达式替换为自己的正则表达式,这将为您解析收件人

    以及使用goldmineapi的示例 实际上有相当多的代码,我将提供一些

    调用ReadMail GoldMine API函数的С包装函数

    public Dictionary<string, string> ReadMail(Dictionary<string, string> NVDictionary)
    {
        const string failure = "Failure to read email\n";
        Int32 res;
        Dictionary<string, string> result = null;
    
        IntPtr nvc = import.GMW_NV_Create();
        if (nvc == null) throw (new CLGMAPIException(failure + "Unable to create name/value container"));
        try
        {
            foreach (KeyValuePair<string, string> kvp in NVDictionary)
            {
                import.GMW_NV_SetValue(nvc, kvp.Key, kvp.Value);
            }
    
            res = import.GMW_Execute("ReadMail", nvc);
    
            if (res > 0)
            {
                int count = import.GMW_NV_Count(nvc);
                result = new Dictionary<string, string>(count);
                IntPtr ptr;
                string name;
    
                for (int i = 0; i < count; i++)
                {
                    ptr = import.GMW_NV_GetNameFromIndex(nvc, i);
                    name = Marshal.PtrToStringAnsi(ptr);
    
                    ptr = import.GMW_NV_GetValue(nvc, name, string.Empty);
                    result[name] = Marshal.PtrToStringAnsi(ptr);
                }
            }
        }
        finally
        {
            import.GMW_NV_Delete(nvc);
        }
    
        switch (res)
        {
            case 0: throw (new CLGMAPIException(failure));
            case -1: throw (new CLGMAPIException(failure + "Message is private"));
            case -2: throw (new CLGMAPIException(failure + "Message not found, or cannot be loaded"));
            case -3: throw (new CLGMAPIException(failure + "Exception"));
            default:
                break;
        }
    
        return result;
    }
    
    公共字典ReadMail(字典)
    {
    const string failure=“读取电子邮件失败\n”;
    Int32 res;
    字典结果=null;
    IntPtr nvc=import.GMW_NV_Create();
    if(nvc==null)抛出(新的CLGMAPIException(失败+“无法创建名称/值容器”);
    尝试
    {
    foreach(NVDictionary中的KeyValuePair kvp)
    {
    import.GMW_NV_SetValue(nvc,kvp.Key,kvp.Value);
    }
    res=import.GMW_Execute(“ReadMail”,nvc);
    如果(分辨率>0)
    {
    int count=导入.GMW\u NV\u计数(nvc);
    结果=新字典(计数);
    IntPtr-ptr;
    字符串名;
    for(int i=0;i
    包装器使用情况

    select dbo.RemoveHTML(rfc822) from Mailbox
    
    public GoldMineEmails(GoldMineAPI api, DataTable mailbox)
    {
        foreach (DataRow emailRow in mailbox.Rows)
        {
            var dict = new Dictionary<string, string>(3);
            dict["MboxRecID"] = emailRow["recid"].ToString();
            dict["History"] = "1";
    
            try
            {
                var res = api.ReadMail(dict);
    
                var email = new GoldMineEmail(res["To"], res["Cc"], res["Bcc"], res["Outgoing"])
                {
                    body = res["Body"],
                    From = res["From"],
                    subject = res["Subject"],
                    user = res["User"]
                };
    
                this.Add(email);
            }
            catch
            {
                throw;
                // error logging
            }
        }
    }
    
    公共goldminemail(GoldMineAPI,DataTable邮箱)
    {
    foreach(mailbox.Rows中的DataRow-emailRow)
    {
    var dict=新字典(3);
    dict[“MboxRecID”]=emailRow[“recid”].ToString();
    dict[“History”]=“1”;
    尝试
    {
    var res=api.ReadMail(dict);
    var电子邮件=新的Goldmine电子邮件(res[“收件人”]、res[“抄送”]、res[“密件抄送”]、res[“发送”])
    {
    body=res[“body”],
    From=res[“From”],
    subject=res[“subject”],
    user=res[“user”]
    };
    添加(电子邮件);
    }
    抓住
    {
    投掷;
    //错误记录
    }
    }
    }
    
    我希望这有帮助。
    请随时与我联系-我可以向您发送源代码示例

    无人?只是一个博客文章的链接或其他东西,让我知道这是不可能的,让事情复杂化,或者我应该尝试用VB或C#。。。基本答案将非常感谢只有我自己有一个点,从哪里开始。。。谢谢