SQL Cursor中的第一条记录缺少一个变量

时间:2015-08-04 18:22:31

标签: sql-server stored-procedures cursor

我正在使用游标在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)移到不同位置,但没有正面结果。

1 个答案:

答案 0 :(得分:1)

一个非常可能的解释是,插入html字符串的参数之一在第一次迭代时为NULL。

当我运行此代码时:

SET @html = Replace(@html,'[keyvalue]', ISNULL(@UniqueKey,''))

结果我得不到'你好'。我一无所获。因此,显然使用REPLACE将NULL值插入字符串与将字符串与NULL连接具有相同的效果:也就是说,它使整个事物为NULL。

尝试在REPLACE语句中的每个变量上使用ISNULL,看看是否无法解决问题。

{{1}}

或者,在proc中进一步向上游进行NULL处理,但要确保不能尝试用NULL替换标记。