Sql server TSQL在8000个字符以下最近的新行拆分

Sql server TSQL在8000个字符以下最近的新行拆分,sql-server,stored-procedures,split,varchar,charindex,Sql Server,Stored Procedures,Split,Varchar,Charindex,这可能很简单,但我不是SQL专家。我正在生成一个需要人工处理的项目列表,并以电子邮件格式发送给相关方。在大多数情况下,它低于8000个字符,但有几次超过了这个数字。问题是,发送电子邮件的存储过程只需要电子邮件正文8000个字符。这就是我的问题 我无法更改发送电子邮件过程,因为。。。我真的不知道为什么。我刚被告知我不能那样做。在这里想办法 关于手头的问题,有足够的背景资料了 我想将最后一行的varchar(max)拆分为8000个字符以下 而不是: 电子邮件1 项目1需要注意!做xyz。 项目2需

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

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

关于手头的问题,有足够的背景资料了

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

而不是:

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

电子邮件2 阿齐奥!做xyz。 我想把它好好分开

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

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


我该怎么问新台词的最后一个CHARINDEX呢?

我开始打这个问题,显然我所需要的只是和某人讨论一下。谢谢你做我不知道的耳朵。当我完成上面的最后一个问题时,我在搜索中看到的东西点击了一下,我找到了答案

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个字符的限制,让我们最后一行中断。字符(13)和字符(10)是换行符和回车符。(我不记得哪台是atm,但谷歌记得。)

这就是找到最后一个换行符的神奇之处,在本例中是双换行符,因为它与我的源数据相比看起来更好

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*/))
剩下的部分就是跟踪你在主体中扮演了多少角色

希望这对某人有用

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