【问题标题】:Cursors and db_sendmail游标和 db_sendmail
【发布时间】:2016-02-25 13:49:21
【问题描述】:

下面的代码我需要循环通过为每个记录集发送电子邮件的查询 - 似乎工作了一段时间,现在我似乎得到了一些好的和一些空白 - 任何人都可以看到为什么有些会变成空白吗?如果我运行查询,它始终会给我正确的结果 - 没有空白行,所以只能假设它与游标有关?

USE [Transport_Comp1]
GO
/****** Object:  StoredProcedure [dbo].[ssp_EmailPOD]    Script Date: 02/25/2016 13:42:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[ssp_EmailPOD]
AS 
DECLARE @name VARCHAR(20),
@dtDate NVARCHAR(50),
@email NVARCHAR(50),
@szBlockCapitols NVARCHAR(50),
@dwJobnumber NVARCHAR(50),
@szDelAddressRef NVARCHAR(50),
@dwInternetJobNo NVARCHAR(50),
@szDelpostCode NVARCHAR(50),
@dwrDecimalLongitude NVARCHAR(50),
@dwrDecimalLatitude NVARCHAR(50),
@szDelAddrName NVARCHAR(50)


DECLARE @body NVARCHAR(1000)



DECLARE C1 CURSOR FOR
SELECT JobItem.dwJobNumber, JobItem.szDelAddrName, JobItem.szDelAddressRef, JobItem.dwInternetJobNo, JobItem.szDelPostCode, Signature.szBlockCapitols, Signature.dwrDecimalLongitude, Signature.dwrDecimalLatitude, StirlingManager_Comp1.dbo.SalesAccounts.szReportText8, Signature.dtDate
FROM dbo.JobItem INNER JOIN dbo.dms_document ON dbo.JobItem.dwJobItemId = dbo.dms_document.dwJobItemId LEFT OUTER JOIN dbo.Signature ON dbo.dms_document.id = dbo.Signature.dwDocumentIdFK LEFT OUTER JOIN DocArchive_Comp1.dbo.dms_document AS dms_document_1 ON dbo.dms_document.id = dms_document_1.id LEFT OUTER JOIN StirlingManager_Comp1.dbo.SalesAccounts ON dbo.JobItem.szAccCode = StirlingManager_Comp1.dbo.SalesAccounts.szAccountCode
WHERE [Transport_Comp1].[dbo].[Signature].[dtDate] > DATEADD(MINUTE, -5,  GETUTCDATE()) AND [Transport_Comp1].[dbo].[Signature].[dtDate] < DATEADD(SECOND,-1,GETUTCDATE()) AND Transport_Comp1.dbo.Signature.bArrived = 0
ORDER BY dtDate ASC; 
OPEN C1

FETCH NEXT FROM C1 INTO
@dwJobnumber, @szDelAddrName, @szDelAddressRef, @dwInternetJobNo, @szDelPostCode, @szBlockCapitols, @dwrDecimalLongitude, @dwrDecimalLatitude, @email, @dtDate

WHILE (@@FETCH_STATUS = 0)
BEGIN
        SET @body = '<html>' + '<BR><BR>'   
            SET @body = @body + '<b>Your Delivery was completed at : ' + @dtDate + '<BR><BR>'
            SET @body = @body + 'Your delivery was signed for by : ' + @szBlockCapitols + '<BR><BR>'
            SET @body = @body + 'Latitude : ' + @dwrDecimalLatitude + '<BR>' + 'Longitude : ' + @dwrDecimalLongitude + '<BR>'
            SET @body = @body + 'Delivery to : ' + @szDelAddrName + '<BR>'
            SET @body = @body + 'Postcode : ' + @szDelpostCode + '<BR>'
            SET @body = @body + 'Delivery Reference :' + @szDelAddressRef + '<BR></html>'


            EXEC msdb.dbo.sp_send_dbmail
            @profile_name = 'SQL_Email',
            @recipients = @email,
            @subject = 'EMAIL POD',            
            @body = @body,
            @body_format ='HTML'
      FETCH NEXT FROM C1 INTO
      @dwJobnumber, @szDelAddrName, @szDelAddressRef, @dwInternetJobNo, @szDelPostCode, @szBlockCapitols, @dwrDecimalLongitude, @dwrDecimalLatitude, @email, @dtDate
END
CLOSE C1
DEALLOCATE C1

【问题讨论】:

  • 您是否尝试过注释掉 dbmail 并放入打印命令?如果你在 @body 中得到一个空值,它会导致各种问题(我也会在构建它时使用 ISNULL(@var, '')。

标签: sql-server database stored-procedures cursor sendmail


【解决方案1】:

正如@KevinM 在上面指出的那样,问题是您的变量中有 NULL。您可以通过不止一种方法来解决这个问题,但最简单的方法是清理您的查询(无论如何这很粗糙)。你真的应该养成使用别名的习惯,它让一切变得容易多了。以下是我将如何重新设计它,这样您的数据中就不会出现 NULL。你必须稍微调整一下,因为我不知道你这里有什么数据类型。

SELECT isnull(j.dwJobNumber, '') as dwJobNumber
    , isnull(j.szDelAddrName, '') as szDelAddrName
    , isnull(j.szDelAddressRef, '') as szDelAddressRef
    , isnull(j.dwInternetJobNo, '') as dwInternetJobNo
    , isnull(j.szDelPostCode, '') as szDelPostCode
    , isnull(s.szBlockCapitols, '') as szBlockCapitols
    , isnull(s.dwrDecimalLongitude, '') as dwrDecimalLongitude
    , isnull(s.dwrDecimalLatitude, '') as dwrDecimalLatitude
    , isnull(sa.szReportText8, '') as szReportText8
    , isnull(s.dtDate, '') as dtDate
FROM dbo.JobItem j
INNER JOIN dbo.dms_document d ON j.dwJobItemId = d.dwJobItemId 
LEFT OUTER JOIN dbo.Signature s ON d.id = s.dwDocumentIdFK 
LEFT OUTER JOIN DocArchive_Comp1.dbo.dms_document AS dms_doc ON d.id = dms_doc.id 
LEFT OUTER JOIN StirlingManager_Comp1.dbo.SalesAccounts sa ON j.szAccCode = sa.SalesAccounts.szAccountCode
WHERE s.dtDate > DATEADD(MINUTE, -5, GETUTCDATE()) 
    AND s.dtDate < DATEADD(SECOND, -1, GETUTCDATE()) 
    AND s.bArrived = 0
ORDER BY dtDate ASC; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 2016-07-08
    • 2016-11-21
    • 2016-02-01
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    相关资源
    最近更新 更多