Sql server 在选择强制转换之前获取@ROWCOUNT值

Sql server 在选择强制转换之前获取@ROWCOUNT值,sql-server,tsql,Sql Server,Tsql,MSSQL2016 我需要从光标中筛选出那些选择不返回结果的邮件,以便不发送空邮件。由于正在对内部选择结果进行html格式化和强制转换,检查 如果@@ROWCOUNT>0 这永远是真的。说得好一点,总是这样 @@行数=1 无论select实际返回的行是什么 是否可以在强制转换之前获取实际的select行数作为临时参数传递到后续的EXEC sp_send_mail yes/no检查 OPEN C1; FETCH NEXT FROM C1 INTO @WishListID, @use

MSSQL2016

我需要从光标中筛选出那些选择不返回结果的邮件,以便不发送空邮件。由于正在对内部选择结果进行html格式化和强制转换,检查

如果@@ROWCOUNT>0

这永远是真的。说得好一点,总是这样

@@行数=1

无论select实际返回的行是什么

是否可以在强制转换之前获取实际的select行数作为临时参数传递到后续的EXEC sp_send_mail yes/no检查

OPEN C1;
    FETCH NEXT FROM C1 INTO
    @WishListID, @userEmail, @category, @range, @geoid, @searchCity, @userName, @GeoLocation
    WHILE @@FETCH_STATUS = 0
    BEGIN
            SET @tableHTML =  
            N'<H4>Hello ' +  @userName + '<H4>Here''s your Daily Digest</H4>' +  
            N'<table border="0">' +  
            N'<tr><th>Department</th>' +  
            N'<th>Name</th><th>Description</th>' +  
            N'<th>Place</th></tr>' +  
            CAST ( ( SELECT td = c.Name, '',  
                    td = p.Name, '',  
                    td = p.Description, '',
                    td = @searchCity
              FROM Products as p 
                    JOIN Categories AS c ON p.CategoryID = c.ID
                    JOIN AspNetUsers AS u ON p.UserID = u.Id
                    JOIN GeoData_ALL AS g ON u.GeoID = g.ID
                    WHERE p.IsApproved = 1 AND p.IsDeleted = 0 AND p.DateExpire > convert(date, getdate()) 
                    AND (@geoid = 0 or g.GeoLocation.STDistance(@GeoLocation) <= (@range*5000))
                    AND (@category = 0 or p.CategoryID = @category)
                    ORDER BY p.ID
                     FOR XML PATH('tr'), TYPE   
                ) AS NVARCHAR(MAX) ) +  
                N'</table>' ;       

                IF @@ROWCOUNT > 0 

                EXEC sp_send_mail
                @from='news@xyz.com',
                @to = @userEmail,  
                @subject = 'Weekly xyz Digest',  
                @body = @tableHTML,  
                @bodytype = 'htmlbody',
                @output_mesg = @out_mesg output, 
                @output_desc = @out_desc output ;  

    FETCH NEXT FROM C1 INTO
    @WishListID, @userEmail, @category, @range, @geoid, @searchCity, @userName, @GeoLocation

    END
    CLOSE C1;
DEALLOCATE C1;

当然这是可能的,在游标循环中执行任何其他操作之前,您只需使用SELECT COUNT*查询即可

但是,也许一种更简洁的方法是检查@tableHTML的值中是否存在@searchCity的值,而不是检查@ROWCOUNT>0

为了回答我想你想问的问题,如果我有一个SET@var='sometext'+selectsomestuff语句,我可以在后面找出SELECT中有多少行吗

答案是否定的。好吧,在没有解析和分析您添加SELECT结果的变量值的情况下是不行的。您始终可以计算填充字符串中的个数。

您可以这样做

select 1

要填充@rowcount

我会选择并在IF-exist中使用它。我认为一种方法是在table之前检查查询的select部分。htmlit看起来像是在cast中使用IF-EXISTS,但没有解决如何检查sp\u send\u mail是否应该启动,我的第一个想法是将select移到cast之外,并将其指定给要检查的temp变量。在任何情况下,我都不是SQL专家,这就是为什么我要问:你能再详细说明一下吗?不。。。当然,你需要在演员阵容之外。关键是要在构建HTML字符串之前查看select是否返回任何内容。提供的所有参数都可以为null或零值,searchCity也不例外。但这建议我检查一下@tableHTML!=。没有行等于空表html:太简单了。谢谢