使用SQL Server 2008中的触发器和存储过程发送SMS

问题描述 投票:2回答:1

我在smslog表上写了一个触发器

ALTER TRIGGER [dbo].[mytrigger]    
   ON  [dbo].[smslog]   
   AFTER INSERT    
AS   
   Declare @MobileNo int   
   Declare @smstext as varchar(300)   
Begin    
   set @MobileNo = ( select mobile from inserted)  
   set @smstext = (select smstext from inserted)  
   set @sResponse = 'test'
   Exec pr_SendSmsSQL @MobileNo, @smstext, @sResponse  
END  

存储过程是

create procedure [dbo].[pr_SendSmsSQL] 
    @MobileNo varchar(12), 
    @smstext as varchar(300), 
    @sResponse varchar(1000) OUT 
as 
BEGIN 
   Declare @iReq int,@hr int 
   Declare @sUrl as varchar(500) 
   DECLARE @errorSource VARCHAR(8000)
   DECLARE @errorDescription VARCHAR(8000) 

   -- Create Object for XMLHTTP 
   EXEC @hr = sp_OACreate 'Microsoft.XMLHTTP', @iReq OUT 

   print @hr 

   if @hr <> 0 
      Raiserror('sp_OACreate Microsoft.XMLHTTP FAILED!', 16, 1) 

   set @sUrl='http://api.clickatell.com/http/sendmsg?user=devendar&password=csx19csx&api_id=3360313&to=#MobNo#&text=#Msg#' 

   set @sUrl=REPLACE(@sUrl,'#MobNo#',@MobileNo) 
   set @sUrl=REPLACE(@sUrl,'#Msg#',@smstext) 

   print @sUrl 

   -- sms code start 
   EXEC @hr = sp_OAMethod @iReq, 'Open', NULL, 'GET', @sUrl, true 
   print @hr 

   if @hr <> 0 
      Raiserror('sp_OAMethod Open FAILED!', 16, 1) 

   EXEC @hr = sp_OAMethod @iReq, 'send' 
   select @iReq
   print @hr 

   if @hr <> 0 
   Begin 
       EXEC sp_OAGetErrorInfo @iReq, @errorSource OUTPUT, @errorDescription OUTPUT

       SELECT [Error Source] = @errorSource, [Description] = @errorDescription

       Raiserror('sp_OAMethod Send FAILED!', 16, 1) 
   end 
else 
Begin
    EXEC @hr = sp_OAGetProperty @iReq,'responseText', @sResponse OUT 
    print @hr

    insert into send_log (Id, mobile, sendtext, response, created, createddate) 
    values(0, @MobileNo, @smstext, @sResponse, 'System', GETDATE())
end
end

我在这里使用clickatell网关请帮我解决这个问题

当我在smslog表中插入一行时,我无法发送短信

我在插入触发器后使用并将参数传递给存储过程发送短信。

请帮帮我

在预先devendar感谢

sql-server-2008 stored-procedures triggers sms-gateway
1个回答
5
投票
ALTER TRIGGER [dbo].[mytrigger]    
   ON  [dbo].[smslog]   
   AFTER INSERT    
AS   
   Declare @MobileNo int   
   Declare @smstext as varchar(300)   
Begin    
   set @MobileNo = ( select mobile from inserted)  
   set @smstext = (select smstext from inserted)  
   set @sResponse = 'test'
   Exec pr_SendSmsSQL @MobileNo, @smstext, @sResponse  
END  

程序

create procedure [dbo].[pr_SendSmsSQL] 
    @MobileNo varchar(12), 
    @smstext as varchar(300), 
    @sResponse varchar(1000) OUT 
as 
BEGIN 
   Declare @iReq int,@hr int 
   Declare @sUrl as varchar(500) 
   DECLARE @errorSource VARCHAR(8000)
   DECLARE @errorDescription VARCHAR(8000) 

   -- Create Object for XMLHTTP 
   EXEC @hr = sp_OACreate 'Microsoft.XMLHTTP', @iReq OUT 

   print @hr 

   if @hr <> 0 
      Raiserror('sp_OACreate Microsoft.XMLHTTP FAILED!', 16, 1) 

   **set @sUrl='http://api.clickatell.com/http/sendmsg?user=devendar&password=csx19csx&api_id=3360313&to=#MobNo#&text=#Msg#'** 

** APi无法正常工作 - 剩余代码非常出色,工作方式很棒**

   set @sUrl=REPLACE(@sUrl,'#MobNo#',@MobileNo) 
   set @sUrl=REPLACE(@sUrl,'#Msg#',@smstext) 

   print @sUrl 

   -- sms code start 
   EXEC @hr = sp_OAMethod @iReq, 'Open', NULL, 'GET', @sUrl, true 
   print @hr 

   if @hr <> 0 
      Raiserror('sp_OAMethod Open FAILED!', 16, 1) 

   EXEC @hr = sp_OAMethod @iReq, 'send' 
   select @iReq
   print @hr 

   if @hr <> 0 
   Begin 
       EXEC sp_OAGetErrorInfo @iReq, @errorSource OUTPUT, @errorDescription OUTPUT

       SELECT [Error Source] = @errorSource, [Description] = @errorDescription

       Raiserror('sp_OAMethod Send FAILED!', 16, 1) 
   end 
else 
Begin
    EXEC @hr = sp_OAGetProperty @iReq,'responseText', @sResponse OUT 
    print @hr

    insert into send_log (Id, mobile, sendtext, response, created, createddate) 
    values(0, @MobileNo, @smstext, @sResponse, 'System', GETDATE())
end
end
© www.soinside.com 2019 - 2024. All rights reserved.