具有灵活参数的EXEC存储过程用于"选择计数(*)..."并发送电子邮件

时间:2016-06-08 15:00:43

标签: stored-procedures sql-server-2005

我希望编写一个存储过程,以便在select count(*)值大于值Menge时发送电子邮件。

这个存储过程应灵活使用,因为更多表格和/或"其中标准"

不幸的是我收到了这个错误,我无法修复它:(

  

Msg 245,Level 16,State 1,Procedure sp_eMail_Test3,Line 23
  转换varchar值时转换失败' select test(*)from test where [sys_completed] is null'数据类型int。

你能帮助我吗?

我的存储过程:

create PROCEDURE [dbo].[sp_eMail_Test3]
 @recordCount as int = 0, 
 @FileN as varchar(max) =null,
 @DatSubj as varchar(20) =null,
 @DatFile as varchar(20) =null,
 @SQL_Count as varchar(max) =null,

 @MySQL as varchar(max)=null,
 @MyTable as varchar(max)=null,
 @MyWhere as varchar(max)=null,

 @Menge as int = 0,

 @eMail_TO varchar(max) =null,
 @eMail_Subject varchar(max) =null,
 @eMail_Body varchar(max) =null

AS
BEGIN
    SET NOCOUNT ON;     
    set @MySQL = 'select count(*) from ' +@MyTable + ' where ' + @MyWhere 
    set @SQL_Count = @MySQL 
    set @recordCount = convert(int, @SQL_Count ) -- <<--this is the error

    IF (@recordCount > @Menge)  
    begin           
        -- variablen zuweisung
        set @DatSubj =  CONVERT(varCHAR(20),  GETDATE() ,120) --datum fürs subject
        set @DatFile =  replace(convert(varchar, getdate(), 120), ':','_') --datum für filename
        set @FileN ='Eska_Report_' + @DatFile +'.csv' --filename

        EXEC msdb.dbo.sp_send_dbmail
            @body_format = 'HTML',
            @profile_name = 'testmailprofile',
            @recipients = @eMail_TO,         
            @subject =  @eMail_Subject ,
            @Body = @eMail_Body  ,
            @query = 'SET NOCOUNT ON;
                        select * from Test where sys_gueltig = ''Y'' 
                        and not sys_completed is null  ',
         @attach_query_result_as_file = 1       , 
         @query_attachment_filename= @FileN     , 
         @query_result_separator = ';'      ,
         @query_result_no_padding= 1,       
         @exclude_query_output =1,      
         @append_query_error = 1,   
         @query_result_header =1
    end    
END

我以这种方式打电话给SP

exec sp_eMail_Test3
    @Menge = 0,
    @eMail_TO = 'testuser@test.xx' ,
    @eMail_Subject = 'test3 ',
    @eMail_Body = 'Hallo, das ist ein Test',
    @MyTable ='test'    ,
    @MyWhere = 'not [sys_completed] is null'

将来我想通过VBA中的ADO conenct调用存储过程

2 个答案:

答案 0 :(得分:0)

这是一个错误,因为:

set @recordCount = convert(int, @SQL_Count ) 

正在尝试将您的SQL语句(select blah blah)从字符串转换为int。

执行存储过程后尝试执行Select @@ROWCOUNT;

答案 1 :(得分:0)

我觉得有必要告诉您,将变量传递到这样的动态字符串会让您对SQL注入开放。这是一种不好的做法,除非受到严格控制,否则通常不赞成。

那说......

将@MySQL从varchar更改为nvarchar。

然后尝试改变这个:

set @MySQL = 'select count(*) from ' +@MyTable + ' where ' + @MyWhere 
set @SQL_Count = @MySQL 
set @recordCount = convert(int, @SQL_Count ) -- <<--this is the error

对此:

set @MySQL = 'select @recordCount=count(2) from ' + @MyTable + ' where ' + @MyWhere 
exec sp_execute @MySQL, N'@recordCount int OUTPUT', @recordCount=@recordCount OUTPUT
相关问题