【问题标题】:First record in SQL Cursor missing a variableSQL 游标中的第一条记录缺少变量
【发布时间】:2015-08-04 18:22:31
【问题描述】:

我正在使用游标在 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 = (SELECT html from NewsLetter where nLID=@nLID) 行移动到不同的位置,但没有积极的结果。

【问题讨论】:

  • @nLID 甚至不会在你的光标内改变,所以看起来你甚至不需要每次都获取它
  • 如果我每次都没有获取它,html不会改变。
  • 实际上,您确实在循环内运行了一个查询以在每次迭代时设置@html。

标签: sql-server stored-procedures cursor


【解决方案1】:

一个很可能的解释是,您插入到 html 字符串中的一个参数在第一次迭代时为 NULL。

当我运行这段代码时:

DECLARE @Str varchar(max) = 'Hello [test]';
DECLARE @test varchar(max) = NULL;

SET @Str = REPLACE(@Str, '[test]', @test);
PRINT @Str;

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

尝试对 REPLACE 语句中的每个变量使用 ISNULL,看看是否不能解决问题。

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

或者,在 proc 的上游进一步执行 NULL 处理,但请确保您不能尝试用 NULL 替换令牌。

【讨论】:

  • 谢谢Tab,这行得通....不知道如何,因为没有传递空值,但它解决了问题。我很感激!
猜你喜欢
  • 1970-01-01
  • 2020-09-07
  • 2014-11-23
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
相关资源
最近更新 更多