Sql server TSQL在8000个字符以下最近的新行拆分
这可能很简单,但我不是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需要注意!做xyzSql 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需
我该怎么问新台词的最后一个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*/))