0

这可能很简单,但我不是 SQL Guru。我正在生成一个需要人工处理的项目列表,并以电子邮件格式将其发送给适当的一方。在大多数情况下,它低于 8000 个字符,但有几次超过了这个数字。问题是发送电子邮件的存储过程只需要 8000 个字符作为电子邮件正文。因此我的问题。

我无法更改发送电子邮件过程,因为...嗯,我真的不知道为什么。我只是被告知我不能那样做。想办法在这里...

足够的背景故事,手头的问题。

我想将我的 varchar(max) 拆分为 8000 个字符以下的最后一行。

代替:

电子邮件 1 项目 1 需要注意!做xyz。第2条需要注意!做xyz。第3条需要注意!做xyz。第 4 项需要 att

电子邮件 2 项!做xyz。我想很好地分割它

电子邮件 1 项目 1 需要注意!做xyz。第2条需要注意!做xyz。第3条需要注意!做xyz。

电子邮件 2 第 4 项需要注意!做xyz。

如何要求新行的最后一个 CHARINDEX?

4

1 回答 1

0

我开始输入这个问题,显然我所需要的只是与某人讨论。谢谢你成为我不知情的耳朵。当我完成上面的最后一个问题时,我之前在搜索中读到的东西点击了,我找到了答案。

ELSE
        BEGIN
            DECLARE @EmailPart VARCHAR(8000)
            DECLARE @CurrentText VARCHAR(8000)
            DECLARE @CurrentPosition BIGINT = 0

            WHILE @CurrentPosition < len(@EmailBody)
            BEGIN
                SET @EmailPart = SUBSTRING(@EmailBody + CHAR(13), @CurrentPosition, 8000)

                SET @CurrentText = left(@EmailPart, Len(@EmailPart) - PatIndex('%' + CHAR(13) + CHAR(10) + CHAR(13) + '%', REVERSE(@EmailPart)))
                SET @CurrentPosition = @CurrentPosition + len(@CurrentText)    

                EXEC .dbo.spSendMail @to = @EmailList
                        ,@cc = @AppCCList --rfc 1/16/15
                        ,@subj = 'Ordering Issues'
                        ,@body = @EmailBody
            END
        END

所以,让我们把它分解一下。

给我我想要处理的文本块。最多 8000 个字符 刚刚意识到 + CHAR(13) 可能需要放在 SUBSTRING 的外部,但我稍后会担心。你明白了……

SET @EmailPart = SUBSTRING(@EmailBody + CHAR(13), @CurrentPosition, 8000)

现在我已经处理了不超过 8000 个字符的限制,让我们得到最后一个换行符。CHAR(13) 和 CHAR(10) 是换行符和回车符。(我不记得哪个是哪个自动取款机,但 Google 会。)

left(@EmailPart, Len(@EmailPart) - PatIndex('%' + CHAR(13) + CHAR(10) + CHAR(13) + '%', REVERSE(@EmailPart)))

这是找到最后一个换行符的魔法,在这种情况下是双换行符,因为它在我的源数据中看起来更好。

PatIndex('%' + CHAR(13) + CHAR(10) + CHAR(13) + '%', REVERSE(@EmailPart))

我们在已反转的 8000 个字符字符串中找到换行符和回车符模式的索引。

这给了我们索引从字符串末尾开始的字符数。然后我们用字符串的长度减去该索引来从字符串的前面找到索引。

Len(@EmailPart) - PatIndex(/*snipped for clarity*/)

一旦我们有了它。我只取左边的 x 字符,其中 x 是上述差异的结果。

left(@EmailPart, Len(@EmailPart) - PatIndex(/*snipped for clarity*/))

其余的只是跟踪您拍摄了多少个角色并循环播放主体。

希望这对某人有用。

于 2015-09-01T17:20:21.240 回答