我正在使用游标在SQL Server中发送新闻稿。一切正常,但第一封电子邮件没有HTML。
这是存储过程:.....
DECLARE
@html varchar(max)
SET @html = (SELECT html from NewsLetter where nLID=@nLID)
DECLARE crsEmailList CURSOR FOR
SELECT email, ListID from lists where category=@Category AND (DLC < DATEADD(DAY, -1,GETDATE()) OR DLC IS NULL)
OPEN crsEmailList
FETCH NEXT FROM crsEmailList INTO @email, @ListID
while @@FETCH_STATUS = 0
BEGIN
DECLARE @UniqueKey varchar(20),
@UnSubscribeURL varchar(200),
@ClickURL varchar(200)
SET @UnSubscribeURL='<a href=''http://.../userfiles/OHP/UnSubscribe.aspx?listID=' + convert(varchar, @ListID) + '''>Unsubscribe</a>'
SET @ClickURL='<a href=''http://.../userfiles/OHP/clicked.aspx?Key=' + convert(varchar, @UniqueKey ) + '&URL='
EXEC [register_system_email_audits] @ListID, @email, @Date, @UniqueKey output
SET @html = (SELECT html from NewsLetter where nLID=@nLID)
SET @html = Replace(@html,'[keyvalue]', @UniqueKey)
SET @html = Replace(@html,'<a href=\''',@ClickURL)
SET @html = Replace(@html,'[UnSubscribe]', @UnSubscribeURL )
SET @html = Replace(@html,'[date]', DATENAME(month, getdate()) )
EXEC msdb.dbo.sp_send_dbmail
@profile_Name ='Local Server',
@recipients= @email ,
@subject = @Subject,
@body = @html,
@body_format='HTML'
FETCH NEXT FROM crsEmailList INTO @email, @ListID
END
我尝试将SET @html =(从NewsLetter中选择html,其中nLID = @ nLID)移到不同位置,但没有正面结果。
答案 0 :(得分:1)
一个非常可能的解释是,插入html字符串的参数之一在第一次迭代时为NULL。
当我运行此代码时:
SET @html = Replace(@html,'[keyvalue]', ISNULL(@UniqueKey,''))
结果我得不到'你好'。我一无所获。因此,显然使用REPLACE将NULL值插入字符串与将字符串与NULL连接具有相同的效果:也就是说,它使整个事物为NULL。
尝试在REPLACE语句中的每个变量上使用ISNULL,看看是否无法解决问题。
{{1}}
或者,在proc中进一步向上游进行NULL处理,但要确保不能尝试用NULL替换标记。