sql数据库中建立定时任务 提示对象名“#tmptable”无效

时间:2022-05-22 21:09:00
sqlserver2000数据库中建立定时任务时候,里面sql语句是直接执行的一个存储过程。
exec sms_behind_sendsms 1
定时执行sms_behind_sendsms存储过程,分析查询时候提示对象名“#tmptable”无效,#tmptable是存储过程中的一个内存表。
这个存储过程在查询分析器里执行是正常的,不知道为什么建立定时任务执行这个存储过程时候就不行了。

求救!!!大神

20 个解决方案

#1


1、#tmptable是存储过程中的一个内存表。这种不是内存表,应该叫临时表。
2、贴出你的代码

#2


哦,临时表。写错了。@的叫内存表。
感觉贴代码没什么用,存储过程太长。

#3


这个存储过程在查询分析器里是可以正常执行的

#4


可以帮助分析,还是贴下吧

#5


提示对象名“#tmptable”无效 这种要看代码,另外@也不叫内存表,叫表变量

#6


alter procedure sms_behind_sendsms
@belong smallint
as

--思路:定时任务每天调度此任务,判断当天是否有需要发送的数据,有的话就写入发送表中
--为了防止手动启动本任务,造成多次发送某类数据,因此发送后需记录日期,发送前需进行日期判断
if exists(
  select top 1 sms_count from s_auto_send_log 
  where convert(char(10),real_time,121) = convert(char(10),getdate(),121)
          and belong = @belong
   )
return
/*----------重要的表结构-------------------
select * from s_disturb       --免打扰名单
select * from s_smsset        --短信表
select * from s_keyword       --关键字表
select * from s_sendtime      --时间段设置表
select * from s_set_sendtime  --各种短信发送时间段设置表
select * from s_para          --发送短信的参数设置表
------------------------------------------*/
----------------------------------------------------------------------------------------------------------
declare @is_gjj_remind char(1),       --是否进行“公积金余额变动提醒” 1是0否
@is_gjj_month_remind char(1), --是否进行“公积金【每月】【15】日定时提醒” 1是0否
@gjj_monthselect char(1),     --【每月】选择参数 1每月2每两月3每季度4每半年5每年 这些值是事先约定好的
@gjj_day int,                 --【15】的输入参数 输入范围:1-28(一个月最少的天数)
@is_dk_remind char(1),        --是否进行“贷款余额变动提醒” 1是0否
@is_repay_mind char(1),       --是否进行“应于还款【10】日前提醒” 1是0否
@repay_day int,               --【10】的输入参数 输入范围:无限制
@is_overdue_remind char(1),   --是否进行“逾期【7】日以上【每日】催收”
@overdue_day int,             --【7】的输入参数 输入范围:无限制
@overdue_dayselect char(1),   --【每日】的选择参数 1每日2每周3每两周4每月
@sendmode char(1),       --发送模式0中心统一发送1各管理部分别发送
@is_gjj_day_remind char(1),   --是否进行“公积金【3】日以上余额无变动人员,给【单位】【职工】【单位及职工】,发送催收短信”
@gjj_day2 int,       --【3】的输入参数
@sel_obj char(1),       --【单位】【职工】【单位及职工】选择参数,0单位1职工2单位及职工
@is_overdue_remind_long char(1),--是否进行“长期逾期:逾期【30】日以上【每日 每周 每两周 每月】催收,向贷款人及【配偶】【担保人】【所在单位】,发送催收短信”
@overdue_day1 int, --【30】的输入参数
@overdue_dayselect1 char(1), --【每日】的选择参数 1每日2每周3每两周4每月
@overdue_sel_obj char(1), --【配偶】的选择参数
@overdue_sel_obj1 char(1), --【担保人】的选择参数
@overdue_sel_obj2 char(1) --【所在单位】的选择参数

declare @sendtimebegin datetime,     --发送时间的开始
@handset char(11),           --手机号码
@smscontent varchar(8000),   --发送内容,包含关键字
@content varchar(8000)       --发送内容,不包含关键字

declare @unit_account char(13),
@person_account char(8),
@sendtype char(1)--发送类型【1单位经办人 2缴存职工 3贷款职工】

--查询相关的参数值
select  @is_gjj_remind = is_gjj_remind,
@is_gjj_month_remind = is_gjj_month_remind,
        @gjj_monthselect = gjj_monthselect,
        @gjj_day = gjj_day,
@is_dk_remind = is_dk_remind,
@is_repay_mind = is_repay_remind,
        @repay_day = repay_day,
@is_overdue_remind = is_overdue_remind,
        @overdue_day = overdue_day,
        @overdue_dayselect = overdue_dayselect, 
@sendmode = sendmode,      
@is_gjj_day_remind = is_gjj_day_remind,
@gjj_day2 = gjj_day2,
@sel_obj = sel_obj,
@is_overdue_remind_long = is_overdue_remind_long,
@overdue_day1 = overdue_day1,
@overdue_dayselect1 = overdue_dayselect1,
@overdue_sel_obj = overdue_sel_obj,
@overdue_sel_obj1 = overdue_sel_obj2,
@overdue_sel_obj2 = overdue_sel_obj3
from s_para 
where belong = @belong

--准备临时表
create table #tmptable
(
        t_id int,               --ID列,保证不重复
        smstype varchar(10),    --短信类型
        sms_send_time datetime, --短信预备发送时间,
        send_to varchar(10),    --接受对象
handset varchar(11),
content varchar(7900)
)
--把前一天没有发送成功的短信,从草稿箱获取再重新发送。重新发送后删除草稿箱内容
insert into #tmptable
select t_id,smstype,dateadd(day,1,sms_send_time),send_to,handset,content
from s_draft
where belong=@belong

delete from s_draft where belong=@belong

declare @tmp_max_id int
select @tmp_max_id=isnull(max(SISMSID),1)+1 from sms_outbox
----------------------------------进行公积金余额变动提醒:同时给单位及个人--------------------------
--思路:第二天给前一天余额有变动的单位及人员发送短信提醒
if @is_gjj_remind = '1'
begin
--1.给发送时间段设置值
select  @sendtimebegin = convert(char(11),getdate(),121) + substring(b.sendtimeset,1,5) + ':00.000'
from s_set_sendtime a,s_sendtime b 
where a.sendtimeid = b.ID 
and a.belong = b.belong
and a.belong = @belong
and smstype = '1'

if convert(char(23),@sendtimebegin,121) = '' goto come_here_1

--2.查询待发送的内容,包含关键字 经办人的短信
select @sendtype = sendto, @smscontent = smscontent 
        from s_smsset 
        where smstype = '1' 
and sendto = '1' 
and status = '7' --终审通过的短信 
and belong = @belong

if isnull(@smscontent,'') = '' goto come_here_101 --无单位短信,跳转到给职工发短信

--3.查询前一天有业务的 单位帐号,手机号码
declare handset_cursor1 cursor for
select  a.unit_account,'',a.handset 
        from m_unitinfo a
where a.belong = @belong 
        and a.status < '2'
and dbo.f_sms_checkphone(a.handset) = 1 --验证手机号是否合法的函数
and a.unit_account not in ( select unit_account from s_disturb where type = '1') --1.经办人短信 2.缴存职工短信 3.贷款职工短信
        and a.unit_account in 
        (   select unit_account from m_unitbusi 
            where real_date >= convert(char(10),dateadd(day,-1,getdate()),121)
            and real_date < convert(char(10),getdate(),121)
            and belong = @belong

            union 

            select unit_account from m_personbusi
            where real_date >= convert(char(10),dateadd(day,-1,getdate()),121)
            and real_date < convert(char(10),getdate(),121) 
            and belong = @belong
        )

open handset_cursor1
fetch next from handset_cursor1 into @unit_account,@person_account,@handset
while @@fetch_status = 0
begin
--发送内容中的关键字替换
exec sms_get_content_by_keyword @sendtype,@smscontent,@belong,@unit_account,@person_account,@content output

--考虑频繁访问MAS服务器数据库,造成速度无比慢,先把待发送的手机号和内容插入到临时表中,同一数据库中插入数据,速度快多了,然后在下面一次性访问MAS服务器数据库即可,能节省点时间。
insert into #tmptable(t_id,smstype,sms_send_time,send_to,handset,content) 
                values (@tmp_max_id,'1',@sendtimebegin,'1',@handset,@content)

                set @tmp_max_id = @tmp_max_id + 1

   fetch next from handset_cursor1 into @unit_account,@person_account,@handset
end
close handset_cursor1
deallocate handset_cursor1

come_here_101:

--2.查询待发送的内容,包含关键字 缴存职工的短信
select @sendtype = sendto, @smscontent = smscontent 
        from s_smsset 
        where smstype = '1' 
and sendto = '2' 
and status = '7'
and belong = @belong 

if isnull(@smscontent,'') = '' goto come_here_1

--3.查询前一日有余额变动【有缴存的或有(2支取 3销户 4冲支取 7年度利息)】的公积金缴存职工的单位帐号,个人帐号,手机号码
declare handset_cursor2 cursor for

select distinct a.unit_account,a.person_account,c.handset 
from m_unitbusidetail a, m_unitbusi b, m_personinfo c
where a.belong = b.belong and a.unit_account = b.unit_account and a.busi_id = b.busi_id
        and a.belong = c.belong and a.unit_account = c.unit_account and a.person_account = c.person_account
        and a.belong = @belong
        and dbo.f_sms_checkphone(c.handset) = 1
and b.real_date >= convert(char(10),dateadd(day,-1,getdate()),121)
and b.real_date < convert(char(10),getdate(),121)
and a.unit_account+a.person_account not in (select unit_account+person_account from s_disturb where belong = @belong and type = '2')--1.经办人短信2.缴存职工短信3.贷款职工短信

        union

select distinct a.unit_account,a.person_account,b.handset 
from m_personbusi a, m_personinfo b 
where a.belong = b.belong and a.unit_account = b.unit_account and a.person_account = b.person_account
        and dbo.f_sms_checkphone(b.handset) = 1
and a.busi_type in ('2','3','4','7')--2支取 3销户 4冲支取 7年度利息
and a.belong = @belong
and a.real_date >= convert(char(10),dateadd(day,-1,getdate()),121)
and a.real_date < convert(char(10),getdate(),121)
and a.unit_account + a.person_account
 not in (select unit_account+person_account from s_disturb where belong = @belong and type = '2')--1.经办人短信2.缴存职工短信3.贷款职工短信

open handset_cursor2
fetch next from handset_cursor2 into @unit_account,@person_account,@handset
while @@fetch_status = 0
begin
--发送内容中的关键字替换
exec sms_get_content_by_keyword @sendtype,@smscontent,@belong,@unit_account,@person_account,@content output

--考虑频繁访问MAS服务器数据库,造成速度无比慢,先把待发送的手机号和内容插入到临时表中,同一数据库中插入数据,速度快多了,然后在下面一次性访问MAS服务器数据库即可,能节省点时间。
insert into #tmptable(t_id,smstype,sms_send_time,send_to,handset,content) 
                values (@tmp_max_id,'1',@sendtimebegin,'2',@handset,@content)

                set @tmp_max_id = @tmp_max_id + 1

   fetch next from handset_cursor2 into @unit_account,@person_account,@handset
end
close handset_cursor2
deallocate handset_cursor2

end

 


#7



------------------------------进行公积金定时提醒-------------------------------------------------------
--目前的思路:每月/两月 n日给上月/上两月余额有变动的人员发送提醒信息

come_here_1:  --上面参数如果不设置的话,跳转到这里来

if @is_gjj_month_remind = '1'
begin
if isnull(@gjj_day,0) = 0 or isnull(@gjj_monthselect,'') = '' goto come_here_2

declare @send_date varchar(10)--发送的日期

--1.给发送时间段设置值
if @gjj_monthselect = '1'--每月(每月发送一次)
begin
set @send_date = convert(char(8),getdate(),121) 
+ case  when len(@gjj_day) = 1 then '0' + cast(@gjj_day as varchar) 
else cast(@gjj_day as varchar) 
end
end
else if @gjj_monthselect = '2'--每两月(2,4,6,8,10,12月发送一次)
begin
set @send_date = case 
                                 when month(getdate()) in (2,4,6,8,10,12) 
 then convert(char(8),getdate(),121) 
 + case when len(@gjj_day) = 1 then '0' + cast(@gjj_day as varchar) 
else cast(@gjj_day as varchar) 
end
 else ''
 end
end
else if @gjj_monthselect = '3'--每季度(1,4,7,10月发送一次)
begin
set @send_date = case when month(getdate()) in (1,4,7,10) 
then convert(char(8),getdate(),121) 
+ case  when len(@gjj_day) = 1 then '0' + cast(@gjj_day as varchar) 
else cast(@gjj_day as varchar) 
end
else ''
end
end
else if @gjj_monthselect = '4'--每半年(每年的1月和7月份分别发送一次)
begin
set @send_date = case when month(getdate()) in (1,7) 
then convert(char(8),getdate(),121) 
+ case  when len(@gjj_day) = 1 then '0' + cast(@gjj_day as varchar) 
else cast(@gjj_day as varchar) 
end
 else ''
 end
end
else if @gjj_monthselect = '5'--每年(每年的7月份发送一次)
begin
set @send_date = '2012-07-'
+ case  when len(@gjj_day) = 1 then '0' + cast(@gjj_day as varchar) 
else cast(@gjj_day as varchar) 
end
end

        --如果发送日不是今天,则跳转到下一项
        if @send_date <> convert(char(10),getdate(),121) goto come_here_2 

--用上面求和的日期+发送时间段,得到具体的发送时间
select  @sendtimebegin = @send_date + ' ' + substring(b.sendtimeset,1,5) + ':00.000'
from s_set_sendtime a,s_sendtime b 
        where a.sendtimeid = b.ID
and a.belong = b.belong
and a.belong = @belong
and smstype = '2'

if convert(char(23),@sendtimebegin,121) = '' goto come_here_2

--2.查询待发送的内容,包含关键字  经办人
select @sendtype = sendto, @smscontent = smscontent 
        from s_smsset 
        where smstype = '2' 
and sendto = '1' 
and status = '7' 
and belong = @belong

if isnull(@smscontent,'') = '' goto come_here_201

--3.查询发送周期内有发生业务的单位帐号,手机号码
declare handset_cursor3 cursor for
select  unit_account,'',handset from m_unitinfo a
where a.belong = @belong 
        and a.status < '2'
and dbo.f_sms_checkphone(a.handset) = 1 --验证手机号是否合法的函数
and a.unit_account not in (select unit_account from s_disturb where belong = @belong and type = '1')--1.经办人短信2.缴存职工短信3.贷款职工短信
        and a.unit_account in 
        (   select unit_account from m_unitbusi 
            where real_date >= case @gjj_monthselect 
                               when '1' then convert(char(7),dateadd(month,-1,getdate()),121) + '-01' --每月
                               when '2' then convert(char(7),dateadd(month,-2,getdate()),121) + '-01' --每两月

                               when '3' then convert(char(7),dateadd(month,-3,getdate()),121) + '-01' --每季
                               when '4' then convert(char(7),dateadd(month,-6,getdate()),121) + '-01' --每半年
                               when '5' then convert(char(7),dateadd(month,-12,getdate()),121) + '-01' --每年
                               else convert(char(7),getdate(),121) + '-01' end
            and real_date < convert(char(7),getdate(),121) + '-01' --上月底之前
            and belong = @belong

            union 

            select unit_account from m_personbusi
            where real_date >= case @gjj_monthselect 
                               when '1' then convert(char(7),dateadd(month,-1,getdate()),121) + '-01' --每月
                               when '2' then convert(char(7),dateadd(month,-2,getdate()),121) + '-01' --每两月
                               when '3' then convert(char(7),dateadd(month,-3,getdate()),121) + '-01' --每季
                               when '4' then convert(char(7),dateadd(month,-6,getdate()),121) + '-01' --每半年
                               when '5' then convert(char(7),dateadd(month,-12,getdate()),121) + '-01' --每年
                               else convert(char(7),getdate(),121) + '-01' end
            and real_date < convert(char(7),getdate(),121) + '-01' --上月底之前
            and belong = @belong
        )

open handset_cursor3
fetch next from handset_cursor3 into @unit_account,@person_account,@handset
while @@fetch_status = 0
begin
--发送内容中的关键字替换
exec sms_get_content_by_keyword @sendtype,@smscontent,@belong,@unit_account,@person_account,@content output

--考虑频繁访问MAS服务器数据库,造成速度无比慢,先把待发送的手机号和内容插入到临时表中,同一数据库中插入数据,速度快多了,然后在下面一次性访问MAS服务器数据库即可,能节省点时间。
insert into #tmptable(t_id,smstype,sms_send_time,send_to,handset,content) 
                values (@tmp_max_id,'2',@sendtimebegin,'1',@handset,@content)

                set @tmp_max_id = @tmp_max_id + 1

   fetch next from handset_cursor3 into @unit_account,@person_account,@handset
end
close handset_cursor3
deallocate handset_cursor3

come_here_201:

--2.查询待发送的内容,包含关键字
select @sendtype = sendto, @smscontent = smscontent 
        from s_smsset 
        where smstype = '2' 
and sendto = '2' 
and status = '7'
and belong = @belong

if isnull(@smscontent,'') = '' goto come_here_2

--3.查询本周期内有公积金业务的职工的单位帐号,个人帐号,手机号码
declare handset_cursor4 cursor for
select  a.unit_account,a.person_account,a.handset 
        from m_personinfo a
where a.belong = @belong 
and dbo.f_sms_checkphone(a.handset) = 1 --验证手机号是否合法的函数
and a.unit_account + a.person_account not in (select unit_account+person_account from s_disturb where belong = @belong and type = '2')--1.经办人短信2.缴存职工短信3.贷款职工短信
        and a.unit_account + a.person_account in 
        (   select a.unit_account + a.person_account 
            from m_unitbusidetail a, m_unitbusi b 
            where a.unit_account = b.unit_account and a.busi_id = b.busi_id
            and b.real_date >= case @gjj_monthselect 
                               when '1' then convert(char(7),dateadd(month,-1,getdate()),121) + '-01' --每月
                               when '2' then convert(char(7),dateadd(month,-2,getdate()),121) + '-01' --每两月
                               when '3' then convert(char(7),dateadd(month,-3,getdate()),121) + '-01' --每季
                               when '4' then convert(char(7),dateadd(month,-6,getdate()),121) + '-01' --每半年
                               when '5' then convert(char(7),dateadd(month,-12,getdate()),121) + '-01' --每年
                               else convert(char(7),getdate(),121) + '-01' end
            and b.real_date < convert(char(7),getdate(),121) + '-01' --上月底之前
            and b.belong = @belong

            union 

            select unit_account + person_account from m_personbusi
            where 
busi_type in ( '2','3','4','7' ) --2支取 3销户 4冲支取 7年度利息 
            and real_date >= case @gjj_monthselect 
                               when '1' then convert(char(7),dateadd(month,-1,getdate()),121) + '-01' --每月
                               when '2' then convert(char(7),dateadd(month,-2,getdate()),121) + '-01' --每两月
                               when '3' then convert(char(7),dateadd(month,-3,getdate()),121) + '-01' --每季
                               when '4' then convert(char(7),dateadd(month,-6,getdate()),121) + '-01' --每半年
                               when '5' then convert(char(7),dateadd(month,-12,getdate()),121) + '-01' --每年
                               else convert(char(7),getdate(),121) + '-01' end
            and real_date < convert(char(7),getdate(),121) + '-01' --上月底之前
            and belong = @belong
        )

open handset_cursor4
fetch next from handset_cursor4 into @unit_account,@person_account,@handset
while @@fetch_status = 0
begin
--发送内容中的关键字替换
exec sms_get_content_by_keyword @sendtype,@smscontent,@belong,@unit_account,@person_account,@content output

--考虑频繁访问MAS服务器数据库,造成速度无比慢,先把待发送的手机号和内容插入到临时表中,同一数据库中插入数据,速度快多了,然后在下面一次性访问MAS服务器数据库即可,能节省点时间。
insert into #tmptable(t_id,smstype,sms_send_time,send_to,handset,content) 
                values (@tmp_max_id,'2',@sendtimebegin,'2',@handset,@content)

                set @tmp_max_id = @tmp_max_id + 1

   fetch next from handset_cursor4 into @unit_account,@person_account,@handset
end
close handset_cursor4
deallocate handset_cursor4
end

#8


ALTER PROCEDURE sms_behind_sendsms @belong SMALLINT
AS --思路:定时任务每天调度此任务,判断当天是否有需要发送的数据,有的话就写入发送表中
--为了防止手动启动本任务,造成多次发送某类数据,因此发送后需记录日期,发送前需进行日期判断
    IF EXISTS ( SELECT TOP 1
                        sms_count
                FROM    s_auto_send_log
                WHERE   CONVERT(CHAR(10), real_time, 121) = CONVERT(CHAR(10), GETDATE(), 121)
                        AND belong = @belong )
        RETURN
/*----------重要的表结构-------------------
select * from s_disturb       --免打扰名单
select * from s_smsset        --短信表
select * from s_keyword       --关键字表
select * from s_sendtime      --时间段设置表
select * from s_set_sendtime  --各种短信发送时间段设置表
select * from s_para          --发送短信的参数设置表
------------------------------------------*/
----------------------------------------------------------------------------------------------------------
    DECLARE @is_gjj_remind CHAR(1) ,       --是否进行“公积金余额变动提醒” 1是0否
        @is_gjj_month_remind CHAR(1) , --是否进行“公积金【每月】【15】日定时提醒” 1是0否
        @gjj_monthselect CHAR(1) ,     --【每月】选择参数 1每月2每两月3每季度4每半年5每年 这些值是事先约定好的
        @gjj_day INT ,                 --【15】的输入参数 输入范围:1-28(一个月最少的天数)
        @is_dk_remind CHAR(1) ,        --是否进行“贷款余额变动提醒” 1是0否
        @is_repay_mind CHAR(1) ,       --是否进行“应于还款【10】日前提醒” 1是0否
        @repay_day INT ,               --【10】的输入参数 输入范围:无限制
        @is_overdue_remind CHAR(1) ,   --是否进行“逾期【7】日以上【每日】催收”
        @overdue_day INT ,             --【7】的输入参数 输入范围:无限制
        @overdue_dayselect CHAR(1) ,   --【每日】的选择参数 1每日2每周3每两周4每月
        @sendmode CHAR(1) ,       --发送模式0中心统一发送1各管理部分别发送
        @is_gjj_day_remind CHAR(1) ,   --是否进行“公积金【3】日以上余额无变动人员,给【单位】【职工】【单位及职工】,发送催收短信”
        @gjj_day2 INT ,       --【3】的输入参数
        @sel_obj CHAR(1) ,       --【单位】【职工】【单位及职工】选择参数,0单位1职工2单位及职工
        @is_overdue_remind_long CHAR(1) ,--是否进行“长期逾期:逾期【30】日以上【每日 每周 每两周 每月】催收,向贷款人及【配偶】【担保人】【所在单位】,发送催收短信”
        @overdue_day1 INT , --【30】的输入参数
        @overdue_dayselect1 CHAR(1) , --【每日】的选择参数 1每日2每周3每两周4每月
        @overdue_sel_obj CHAR(1) , --【配偶】的选择参数
        @overdue_sel_obj1 CHAR(1) , --【担保人】的选择参数
        @overdue_sel_obj2 CHAR(1) --【所在单位】的选择参数

    DECLARE @sendtimebegin DATETIME ,     --发送时间的开始
        @handset CHAR(11) ,           --手机号码
        @smscontent VARCHAR(8000) ,   --发送内容,包含关键字
        @content VARCHAR(8000)       --发送内容,不包含关键字

    DECLARE @unit_account CHAR(13) ,
        @person_account CHAR(8) ,
        @sendtype CHAR(1)--发送类型【1单位经办人 2缴存职工 3贷款职工】

--查询相关的参数值
    SELECT  @is_gjj_remind = is_gjj_remind ,
            @is_gjj_month_remind = is_gjj_month_remind ,
            @gjj_monthselect = gjj_monthselect ,
            @gjj_day = gjj_day ,
            @is_dk_remind = is_dk_remind ,
            @is_repay_mind = is_repay_remind ,
            @repay_day = repay_day ,
            @is_overdue_remind = is_overdue_remind ,
            @overdue_day = overdue_day ,
            @overdue_dayselect = overdue_dayselect ,
            @sendmode = sendmode ,
            @is_gjj_day_remind = is_gjj_day_remind ,
            @gjj_day2 = gjj_day2 ,
            @sel_obj = sel_obj ,
            @is_overdue_remind_long = is_overdue_remind_long ,
            @overdue_day1 = overdue_day1 ,
            @overdue_dayselect1 = overdue_dayselect1 ,
            @overdue_sel_obj = overdue_sel_obj ,
            @overdue_sel_obj1 = overdue_sel_obj2 ,
            @overdue_sel_obj2 = overdue_sel_obj3
    FROM    s_para
    WHERE   belong = @belong

--准备临时表
IF OBJECT_ID('tempdb..#tmptable','u')IS NULL  加一段这个
BEGIN
    CREATE TABLE #tmptable
        (
          t_id INT ,               --ID列,保证不重复
          smstype VARCHAR(10) ,    --短信类型
          sms_send_time DATETIME , --短信预备发送时间,
          send_to VARCHAR(10) ,    --接受对象
          handset VARCHAR(11) ,
          content VARCHAR(7900)
        )
END 
--把前一天没有发送成功的短信,从草稿箱获取再重新发送。重新发送后删除草稿箱内容
    INSERT  INTO #tmptable
            SELECT  t_id ,
                    smstype ,
                    DATEADD(day, 1, sms_send_time) ,
                    send_to ,
                    handset ,
                    content
            FROM    s_draft
            WHERE   belong = @belong

    DELETE  FROM s_draft
    WHERE   belong = @belong

    DECLARE @tmp_max_id INT
    SELECT  @tmp_max_id = ISNULL(MAX(SISMSID), 1) + 1
    FROM    sms_outbox
----------------------------------进行公积金余额变动提醒:同时给单位及个人--------------------------
--思路:第二天给前一天余额有变动的单位及人员发送短信提醒
    IF @is_gjj_remind = '1'
        BEGIN
--1.给发送时间段设置值
            SELECT  @sendtimebegin = CONVERT(CHAR(11), GETDATE(), 121)
                    + SUBSTRING(b.sendtimeset, 1, 5) + ':00.000'
            FROM    s_set_sendtime a ,
                    s_sendtime b
            WHERE   a.sendtimeid = b.ID
                    AND a.belong = b.belong
                    AND a.belong = @belong
                    AND smstype = '1'

            IF CONVERT(CHAR(23), @sendtimebegin, 121) = ''
                GOTO come_here_1

--2.查询待发送的内容,包含关键字 经办人的短信
            SELECT  @sendtype = sendto ,
                    @smscontent = smscontent
            FROM    s_smsset
            WHERE   smstype = '1'
                    AND sendto = '1'
                    AND status = '7' --终审通过的短信 
                    AND belong = @belong

            IF ISNULL(@smscontent, '') = ''
                GOTO come_here_101 --无单位短信,跳转到给职工发短信

--3.查询前一天有业务的 单位帐号,手机号码
            DECLARE handset_cursor1 CURSOR
            FOR
                SELECT  a.unit_account ,
                        '' ,
                        a.handset
                FROM    m_unitinfo a
                WHERE   a.belong = @belong
                        AND a.status < '2'
                        AND dbo.f_sms_checkphone(a.handset) = 1 --验证手机号是否合法的函数
                        AND a.unit_account NOT IN ( SELECT  unit_account
                                                    FROM    s_disturb
                                                    WHERE   type = '1' ) --1.经办人短信 2.缴存职工短信 3.贷款职工短信
                        AND a.unit_account IN (
                        SELECT  unit_account
                        FROM    m_unitbusi
                        WHERE   real_date >= CONVERT(CHAR(10), DATEADD(day, -1,
                                                              GETDATE()), 121)
                                AND real_date < CONVERT(CHAR(10), GETDATE(), 121)
                                AND belong = @belong
                        UNION
                        SELECT  unit_account
                        FROM    m_personbusi
                        WHERE   real_date >= CONVERT(CHAR(10), DATEADD(day, -1,
                                                              GETDATE()), 121)
                                AND real_date < CONVERT(CHAR(10), GETDATE(), 121)
                                AND belong = @belong )

            OPEN handset_cursor1
            FETCH NEXT FROM handset_cursor1 INTO @unit_account,
                @person_account, @handset
            WHILE @@fetch_status = 0
                BEGIN
--发送内容中的关键字替换
                    EXEC sms_get_content_by_keyword @sendtype, @smscontent,
                        @belong, @unit_account, @person_account,
                        @content OUTPUT
代码过长我后面没贴

#9


还有你的那些if/else,while的,都加上begin end包住,特别是if /else,如果不加begin/end,这个对接下来的第一句有效,对第二句开始就无效

#10


代码发重了,还没发完整。

#11


代码发重了,还没发完整。

#12


begin/end这个我知道,我只是在只执行if else下面一句的情况才不加begin end的。

#13


我来猜猜看:
你的存储过程会创建一个临时表 #tmptable,插入数据。
然后调用这会向 s_auto_send_log 插入日志,标记存储过程被执行过了,并且会读取 #tmptable 表的数据做某些处理。

那么好玩的来了。
如果上层调用者还没有处理完 #tmptable 表的数据,连接意外断开了,整个 #tmptable 表就没了。
然后试图再调用存储过程,日志表已经有记录了,直接跳出,那么  #tmptable 表没有被创建,上层调用者试图从 #tmptable 表取数就会出 提示对象名“#tmptable”无效的错误了。

#14


最后是会向s_auto_send_log插入日志,但是s_auto_send_log表在建立定时任务的时候是没有数据的。

#15


对象名“#tmptable”无效 应该不是sp内而是上层调用者的错误吧。
那么很显然在某种条件下sp没有创建#tmptable。

#16


引用 15 楼 Tiger_Zhao 的回复:
对象名“#tmptable”无效 应该不是sp内而是上层调用者的错误吧。
那么很显然在某种条件下sp没有创建#tmptable。

能不能给解释下什么叫上层调用者的错误? sql数据库中建立定时任务 提示对象名“#tmptable”无效

#17


存储过程我把开始的判断删除了还是不行。
现在存储过程内除了开始定义的变量以及变量赋值,紧接着就是创建#tmptable这个临时表了。
不过还是不能新建包,依旧提示“对象名‘#tmptable’无效”

#18


你会不会上层调用跳过了sp?
加调试 PRINT 吧。

#19



引用 18 楼 Tiger_Zhao 的回复:
你会不会上层调用跳过了sp?
加调试 PRINT 吧。

上层调用跳过了sp?
我是新建包调用存储过程如何调试?

#20


个人不建议把复杂的sql搞成job, 难以维护高度, 最好是写代码做成Windows服务

如果你一定要做job, 可以把中间结果放在一个调试专用的表中保存……

#1


1、#tmptable是存储过程中的一个内存表。这种不是内存表,应该叫临时表。
2、贴出你的代码

#2


哦,临时表。写错了。@的叫内存表。
感觉贴代码没什么用,存储过程太长。

#3


这个存储过程在查询分析器里是可以正常执行的

#4


可以帮助分析,还是贴下吧

#5


提示对象名“#tmptable”无效 这种要看代码,另外@也不叫内存表,叫表变量

#6


alter procedure sms_behind_sendsms
@belong smallint
as

--思路:定时任务每天调度此任务,判断当天是否有需要发送的数据,有的话就写入发送表中
--为了防止手动启动本任务,造成多次发送某类数据,因此发送后需记录日期,发送前需进行日期判断
if exists(
  select top 1 sms_count from s_auto_send_log 
  where convert(char(10),real_time,121) = convert(char(10),getdate(),121)
          and belong = @belong
   )
return
/*----------重要的表结构-------------------
select * from s_disturb       --免打扰名单
select * from s_smsset        --短信表
select * from s_keyword       --关键字表
select * from s_sendtime      --时间段设置表
select * from s_set_sendtime  --各种短信发送时间段设置表
select * from s_para          --发送短信的参数设置表
------------------------------------------*/
----------------------------------------------------------------------------------------------------------
declare @is_gjj_remind char(1),       --是否进行“公积金余额变动提醒” 1是0否
@is_gjj_month_remind char(1), --是否进行“公积金【每月】【15】日定时提醒” 1是0否
@gjj_monthselect char(1),     --【每月】选择参数 1每月2每两月3每季度4每半年5每年 这些值是事先约定好的
@gjj_day int,                 --【15】的输入参数 输入范围:1-28(一个月最少的天数)
@is_dk_remind char(1),        --是否进行“贷款余额变动提醒” 1是0否
@is_repay_mind char(1),       --是否进行“应于还款【10】日前提醒” 1是0否
@repay_day int,               --【10】的输入参数 输入范围:无限制
@is_overdue_remind char(1),   --是否进行“逾期【7】日以上【每日】催收”
@overdue_day int,             --【7】的输入参数 输入范围:无限制
@overdue_dayselect char(1),   --【每日】的选择参数 1每日2每周3每两周4每月
@sendmode char(1),       --发送模式0中心统一发送1各管理部分别发送
@is_gjj_day_remind char(1),   --是否进行“公积金【3】日以上余额无变动人员,给【单位】【职工】【单位及职工】,发送催收短信”
@gjj_day2 int,       --【3】的输入参数
@sel_obj char(1),       --【单位】【职工】【单位及职工】选择参数,0单位1职工2单位及职工
@is_overdue_remind_long char(1),--是否进行“长期逾期:逾期【30】日以上【每日 每周 每两周 每月】催收,向贷款人及【配偶】【担保人】【所在单位】,发送催收短信”
@overdue_day1 int, --【30】的输入参数
@overdue_dayselect1 char(1), --【每日】的选择参数 1每日2每周3每两周4每月
@overdue_sel_obj char(1), --【配偶】的选择参数
@overdue_sel_obj1 char(1), --【担保人】的选择参数
@overdue_sel_obj2 char(1) --【所在单位】的选择参数

declare @sendtimebegin datetime,     --发送时间的开始
@handset char(11),           --手机号码
@smscontent varchar(8000),   --发送内容,包含关键字
@content varchar(8000)       --发送内容,不包含关键字

declare @unit_account char(13),
@person_account char(8),
@sendtype char(1)--发送类型【1单位经办人 2缴存职工 3贷款职工】

--查询相关的参数值
select  @is_gjj_remind = is_gjj_remind,
@is_gjj_month_remind = is_gjj_month_remind,
        @gjj_monthselect = gjj_monthselect,
        @gjj_day = gjj_day,
@is_dk_remind = is_dk_remind,
@is_repay_mind = is_repay_remind,
        @repay_day = repay_day,
@is_overdue_remind = is_overdue_remind,
        @overdue_day = overdue_day,
        @overdue_dayselect = overdue_dayselect, 
@sendmode = sendmode,      
@is_gjj_day_remind = is_gjj_day_remind,
@gjj_day2 = gjj_day2,
@sel_obj = sel_obj,
@is_overdue_remind_long = is_overdue_remind_long,
@overdue_day1 = overdue_day1,
@overdue_dayselect1 = overdue_dayselect1,
@overdue_sel_obj = overdue_sel_obj,
@overdue_sel_obj1 = overdue_sel_obj2,
@overdue_sel_obj2 = overdue_sel_obj3
from s_para 
where belong = @belong

--准备临时表
create table #tmptable
(
        t_id int,               --ID列,保证不重复
        smstype varchar(10),    --短信类型
        sms_send_time datetime, --短信预备发送时间,
        send_to varchar(10),    --接受对象
handset varchar(11),
content varchar(7900)
)
--把前一天没有发送成功的短信,从草稿箱获取再重新发送。重新发送后删除草稿箱内容
insert into #tmptable
select t_id,smstype,dateadd(day,1,sms_send_time),send_to,handset,content
from s_draft
where belong=@belong

delete from s_draft where belong=@belong

declare @tmp_max_id int
select @tmp_max_id=isnull(max(SISMSID),1)+1 from sms_outbox
----------------------------------进行公积金余额变动提醒:同时给单位及个人--------------------------
--思路:第二天给前一天余额有变动的单位及人员发送短信提醒
if @is_gjj_remind = '1'
begin
--1.给发送时间段设置值
select  @sendtimebegin = convert(char(11),getdate(),121) + substring(b.sendtimeset,1,5) + ':00.000'
from s_set_sendtime a,s_sendtime b 
where a.sendtimeid = b.ID 
and a.belong = b.belong
and a.belong = @belong
and smstype = '1'

if convert(char(23),@sendtimebegin,121) = '' goto come_here_1

--2.查询待发送的内容,包含关键字 经办人的短信
select @sendtype = sendto, @smscontent = smscontent 
        from s_smsset 
        where smstype = '1' 
and sendto = '1' 
and status = '7' --终审通过的短信 
and belong = @belong

if isnull(@smscontent,'') = '' goto come_here_101 --无单位短信,跳转到给职工发短信

--3.查询前一天有业务的 单位帐号,手机号码
declare handset_cursor1 cursor for
select  a.unit_account,'',a.handset 
        from m_unitinfo a
where a.belong = @belong 
        and a.status < '2'
and dbo.f_sms_checkphone(a.handset) = 1 --验证手机号是否合法的函数
and a.unit_account not in ( select unit_account from s_disturb where type = '1') --1.经办人短信 2.缴存职工短信 3.贷款职工短信
        and a.unit_account in 
        (   select unit_account from m_unitbusi 
            where real_date >= convert(char(10),dateadd(day,-1,getdate()),121)
            and real_date < convert(char(10),getdate(),121)
            and belong = @belong

            union 

            select unit_account from m_personbusi
            where real_date >= convert(char(10),dateadd(day,-1,getdate()),121)
            and real_date < convert(char(10),getdate(),121) 
            and belong = @belong
        )

open handset_cursor1
fetch next from handset_cursor1 into @unit_account,@person_account,@handset
while @@fetch_status = 0
begin
--发送内容中的关键字替换
exec sms_get_content_by_keyword @sendtype,@smscontent,@belong,@unit_account,@person_account,@content output

--考虑频繁访问MAS服务器数据库,造成速度无比慢,先把待发送的手机号和内容插入到临时表中,同一数据库中插入数据,速度快多了,然后在下面一次性访问MAS服务器数据库即可,能节省点时间。
insert into #tmptable(t_id,smstype,sms_send_time,send_to,handset,content) 
                values (@tmp_max_id,'1',@sendtimebegin,'1',@handset,@content)

                set @tmp_max_id = @tmp_max_id + 1

   fetch next from handset_cursor1 into @unit_account,@person_account,@handset
end
close handset_cursor1
deallocate handset_cursor1

come_here_101:

--2.查询待发送的内容,包含关键字 缴存职工的短信
select @sendtype = sendto, @smscontent = smscontent 
        from s_smsset 
        where smstype = '1' 
and sendto = '2' 
and status = '7'
and belong = @belong 

if isnull(@smscontent,'') = '' goto come_here_1

--3.查询前一日有余额变动【有缴存的或有(2支取 3销户 4冲支取 7年度利息)】的公积金缴存职工的单位帐号,个人帐号,手机号码
declare handset_cursor2 cursor for

select distinct a.unit_account,a.person_account,c.handset 
from m_unitbusidetail a, m_unitbusi b, m_personinfo c
where a.belong = b.belong and a.unit_account = b.unit_account and a.busi_id = b.busi_id
        and a.belong = c.belong and a.unit_account = c.unit_account and a.person_account = c.person_account
        and a.belong = @belong
        and dbo.f_sms_checkphone(c.handset) = 1
and b.real_date >= convert(char(10),dateadd(day,-1,getdate()),121)
and b.real_date < convert(char(10),getdate(),121)
and a.unit_account+a.person_account not in (select unit_account+person_account from s_disturb where belong = @belong and type = '2')--1.经办人短信2.缴存职工短信3.贷款职工短信

        union

select distinct a.unit_account,a.person_account,b.handset 
from m_personbusi a, m_personinfo b 
where a.belong = b.belong and a.unit_account = b.unit_account and a.person_account = b.person_account
        and dbo.f_sms_checkphone(b.handset) = 1
and a.busi_type in ('2','3','4','7')--2支取 3销户 4冲支取 7年度利息
and a.belong = @belong
and a.real_date >= convert(char(10),dateadd(day,-1,getdate()),121)
and a.real_date < convert(char(10),getdate(),121)
and a.unit_account + a.person_account
 not in (select unit_account+person_account from s_disturb where belong = @belong and type = '2')--1.经办人短信2.缴存职工短信3.贷款职工短信

open handset_cursor2
fetch next from handset_cursor2 into @unit_account,@person_account,@handset
while @@fetch_status = 0
begin
--发送内容中的关键字替换
exec sms_get_content_by_keyword @sendtype,@smscontent,@belong,@unit_account,@person_account,@content output

--考虑频繁访问MAS服务器数据库,造成速度无比慢,先把待发送的手机号和内容插入到临时表中,同一数据库中插入数据,速度快多了,然后在下面一次性访问MAS服务器数据库即可,能节省点时间。
insert into #tmptable(t_id,smstype,sms_send_time,send_to,handset,content) 
                values (@tmp_max_id,'1',@sendtimebegin,'2',@handset,@content)

                set @tmp_max_id = @tmp_max_id + 1

   fetch next from handset_cursor2 into @unit_account,@person_account,@handset
end
close handset_cursor2
deallocate handset_cursor2

end

 


#7



------------------------------进行公积金定时提醒-------------------------------------------------------
--目前的思路:每月/两月 n日给上月/上两月余额有变动的人员发送提醒信息

come_here_1:  --上面参数如果不设置的话,跳转到这里来

if @is_gjj_month_remind = '1'
begin
if isnull(@gjj_day,0) = 0 or isnull(@gjj_monthselect,'') = '' goto come_here_2

declare @send_date varchar(10)--发送的日期

--1.给发送时间段设置值
if @gjj_monthselect = '1'--每月(每月发送一次)
begin
set @send_date = convert(char(8),getdate(),121) 
+ case  when len(@gjj_day) = 1 then '0' + cast(@gjj_day as varchar) 
else cast(@gjj_day as varchar) 
end
end
else if @gjj_monthselect = '2'--每两月(2,4,6,8,10,12月发送一次)
begin
set @send_date = case 
                                 when month(getdate()) in (2,4,6,8,10,12) 
 then convert(char(8),getdate(),121) 
 + case when len(@gjj_day) = 1 then '0' + cast(@gjj_day as varchar) 
else cast(@gjj_day as varchar) 
end
 else ''
 end
end
else if @gjj_monthselect = '3'--每季度(1,4,7,10月发送一次)
begin
set @send_date = case when month(getdate()) in (1,4,7,10) 
then convert(char(8),getdate(),121) 
+ case  when len(@gjj_day) = 1 then '0' + cast(@gjj_day as varchar) 
else cast(@gjj_day as varchar) 
end
else ''
end
end
else if @gjj_monthselect = '4'--每半年(每年的1月和7月份分别发送一次)
begin
set @send_date = case when month(getdate()) in (1,7) 
then convert(char(8),getdate(),121) 
+ case  when len(@gjj_day) = 1 then '0' + cast(@gjj_day as varchar) 
else cast(@gjj_day as varchar) 
end
 else ''
 end
end
else if @gjj_monthselect = '5'--每年(每年的7月份发送一次)
begin
set @send_date = '2012-07-'
+ case  when len(@gjj_day) = 1 then '0' + cast(@gjj_day as varchar) 
else cast(@gjj_day as varchar) 
end
end

        --如果发送日不是今天,则跳转到下一项
        if @send_date <> convert(char(10),getdate(),121) goto come_here_2 

--用上面求和的日期+发送时间段,得到具体的发送时间
select  @sendtimebegin = @send_date + ' ' + substring(b.sendtimeset,1,5) + ':00.000'
from s_set_sendtime a,s_sendtime b 
        where a.sendtimeid = b.ID
and a.belong = b.belong
and a.belong = @belong
and smstype = '2'

if convert(char(23),@sendtimebegin,121) = '' goto come_here_2

--2.查询待发送的内容,包含关键字  经办人
select @sendtype = sendto, @smscontent = smscontent 
        from s_smsset 
        where smstype = '2' 
and sendto = '1' 
and status = '7' 
and belong = @belong

if isnull(@smscontent,'') = '' goto come_here_201

--3.查询发送周期内有发生业务的单位帐号,手机号码
declare handset_cursor3 cursor for
select  unit_account,'',handset from m_unitinfo a
where a.belong = @belong 
        and a.status < '2'
and dbo.f_sms_checkphone(a.handset) = 1 --验证手机号是否合法的函数
and a.unit_account not in (select unit_account from s_disturb where belong = @belong and type = '1')--1.经办人短信2.缴存职工短信3.贷款职工短信
        and a.unit_account in 
        (   select unit_account from m_unitbusi 
            where real_date >= case @gjj_monthselect 
                               when '1' then convert(char(7),dateadd(month,-1,getdate()),121) + '-01' --每月
                               when '2' then convert(char(7),dateadd(month,-2,getdate()),121) + '-01' --每两月

                               when '3' then convert(char(7),dateadd(month,-3,getdate()),121) + '-01' --每季
                               when '4' then convert(char(7),dateadd(month,-6,getdate()),121) + '-01' --每半年
                               when '5' then convert(char(7),dateadd(month,-12,getdate()),121) + '-01' --每年
                               else convert(char(7),getdate(),121) + '-01' end
            and real_date < convert(char(7),getdate(),121) + '-01' --上月底之前
            and belong = @belong

            union 

            select unit_account from m_personbusi
            where real_date >= case @gjj_monthselect 
                               when '1' then convert(char(7),dateadd(month,-1,getdate()),121) + '-01' --每月
                               when '2' then convert(char(7),dateadd(month,-2,getdate()),121) + '-01' --每两月
                               when '3' then convert(char(7),dateadd(month,-3,getdate()),121) + '-01' --每季
                               when '4' then convert(char(7),dateadd(month,-6,getdate()),121) + '-01' --每半年
                               when '5' then convert(char(7),dateadd(month,-12,getdate()),121) + '-01' --每年
                               else convert(char(7),getdate(),121) + '-01' end
            and real_date < convert(char(7),getdate(),121) + '-01' --上月底之前
            and belong = @belong
        )

open handset_cursor3
fetch next from handset_cursor3 into @unit_account,@person_account,@handset
while @@fetch_status = 0
begin
--发送内容中的关键字替换
exec sms_get_content_by_keyword @sendtype,@smscontent,@belong,@unit_account,@person_account,@content output

--考虑频繁访问MAS服务器数据库,造成速度无比慢,先把待发送的手机号和内容插入到临时表中,同一数据库中插入数据,速度快多了,然后在下面一次性访问MAS服务器数据库即可,能节省点时间。
insert into #tmptable(t_id,smstype,sms_send_time,send_to,handset,content) 
                values (@tmp_max_id,'2',@sendtimebegin,'1',@handset,@content)

                set @tmp_max_id = @tmp_max_id + 1

   fetch next from handset_cursor3 into @unit_account,@person_account,@handset
end
close handset_cursor3
deallocate handset_cursor3

come_here_201:

--2.查询待发送的内容,包含关键字
select @sendtype = sendto, @smscontent = smscontent 
        from s_smsset 
        where smstype = '2' 
and sendto = '2' 
and status = '7'
and belong = @belong

if isnull(@smscontent,'') = '' goto come_here_2

--3.查询本周期内有公积金业务的职工的单位帐号,个人帐号,手机号码
declare handset_cursor4 cursor for
select  a.unit_account,a.person_account,a.handset 
        from m_personinfo a
where a.belong = @belong 
and dbo.f_sms_checkphone(a.handset) = 1 --验证手机号是否合法的函数
and a.unit_account + a.person_account not in (select unit_account+person_account from s_disturb where belong = @belong and type = '2')--1.经办人短信2.缴存职工短信3.贷款职工短信
        and a.unit_account + a.person_account in 
        (   select a.unit_account + a.person_account 
            from m_unitbusidetail a, m_unitbusi b 
            where a.unit_account = b.unit_account and a.busi_id = b.busi_id
            and b.real_date >= case @gjj_monthselect 
                               when '1' then convert(char(7),dateadd(month,-1,getdate()),121) + '-01' --每月
                               when '2' then convert(char(7),dateadd(month,-2,getdate()),121) + '-01' --每两月
                               when '3' then convert(char(7),dateadd(month,-3,getdate()),121) + '-01' --每季
                               when '4' then convert(char(7),dateadd(month,-6,getdate()),121) + '-01' --每半年
                               when '5' then convert(char(7),dateadd(month,-12,getdate()),121) + '-01' --每年
                               else convert(char(7),getdate(),121) + '-01' end
            and b.real_date < convert(char(7),getdate(),121) + '-01' --上月底之前
            and b.belong = @belong

            union 

            select unit_account + person_account from m_personbusi
            where 
busi_type in ( '2','3','4','7' ) --2支取 3销户 4冲支取 7年度利息 
            and real_date >= case @gjj_monthselect 
                               when '1' then convert(char(7),dateadd(month,-1,getdate()),121) + '-01' --每月
                               when '2' then convert(char(7),dateadd(month,-2,getdate()),121) + '-01' --每两月
                               when '3' then convert(char(7),dateadd(month,-3,getdate()),121) + '-01' --每季
                               when '4' then convert(char(7),dateadd(month,-6,getdate()),121) + '-01' --每半年
                               when '5' then convert(char(7),dateadd(month,-12,getdate()),121) + '-01' --每年
                               else convert(char(7),getdate(),121) + '-01' end
            and real_date < convert(char(7),getdate(),121) + '-01' --上月底之前
            and belong = @belong
        )

open handset_cursor4
fetch next from handset_cursor4 into @unit_account,@person_account,@handset
while @@fetch_status = 0
begin
--发送内容中的关键字替换
exec sms_get_content_by_keyword @sendtype,@smscontent,@belong,@unit_account,@person_account,@content output

--考虑频繁访问MAS服务器数据库,造成速度无比慢,先把待发送的手机号和内容插入到临时表中,同一数据库中插入数据,速度快多了,然后在下面一次性访问MAS服务器数据库即可,能节省点时间。
insert into #tmptable(t_id,smstype,sms_send_time,send_to,handset,content) 
                values (@tmp_max_id,'2',@sendtimebegin,'2',@handset,@content)

                set @tmp_max_id = @tmp_max_id + 1

   fetch next from handset_cursor4 into @unit_account,@person_account,@handset
end
close handset_cursor4
deallocate handset_cursor4
end

#8


ALTER PROCEDURE sms_behind_sendsms @belong SMALLINT
AS --思路:定时任务每天调度此任务,判断当天是否有需要发送的数据,有的话就写入发送表中
--为了防止手动启动本任务,造成多次发送某类数据,因此发送后需记录日期,发送前需进行日期判断
    IF EXISTS ( SELECT TOP 1
                        sms_count
                FROM    s_auto_send_log
                WHERE   CONVERT(CHAR(10), real_time, 121) = CONVERT(CHAR(10), GETDATE(), 121)
                        AND belong = @belong )
        RETURN
/*----------重要的表结构-------------------
select * from s_disturb       --免打扰名单
select * from s_smsset        --短信表
select * from s_keyword       --关键字表
select * from s_sendtime      --时间段设置表
select * from s_set_sendtime  --各种短信发送时间段设置表
select * from s_para          --发送短信的参数设置表
------------------------------------------*/
----------------------------------------------------------------------------------------------------------
    DECLARE @is_gjj_remind CHAR(1) ,       --是否进行“公积金余额变动提醒” 1是0否
        @is_gjj_month_remind CHAR(1) , --是否进行“公积金【每月】【15】日定时提醒” 1是0否
        @gjj_monthselect CHAR(1) ,     --【每月】选择参数 1每月2每两月3每季度4每半年5每年 这些值是事先约定好的
        @gjj_day INT ,                 --【15】的输入参数 输入范围:1-28(一个月最少的天数)
        @is_dk_remind CHAR(1) ,        --是否进行“贷款余额变动提醒” 1是0否
        @is_repay_mind CHAR(1) ,       --是否进行“应于还款【10】日前提醒” 1是0否
        @repay_day INT ,               --【10】的输入参数 输入范围:无限制
        @is_overdue_remind CHAR(1) ,   --是否进行“逾期【7】日以上【每日】催收”
        @overdue_day INT ,             --【7】的输入参数 输入范围:无限制
        @overdue_dayselect CHAR(1) ,   --【每日】的选择参数 1每日2每周3每两周4每月
        @sendmode CHAR(1) ,       --发送模式0中心统一发送1各管理部分别发送
        @is_gjj_day_remind CHAR(1) ,   --是否进行“公积金【3】日以上余额无变动人员,给【单位】【职工】【单位及职工】,发送催收短信”
        @gjj_day2 INT ,       --【3】的输入参数
        @sel_obj CHAR(1) ,       --【单位】【职工】【单位及职工】选择参数,0单位1职工2单位及职工
        @is_overdue_remind_long CHAR(1) ,--是否进行“长期逾期:逾期【30】日以上【每日 每周 每两周 每月】催收,向贷款人及【配偶】【担保人】【所在单位】,发送催收短信”
        @overdue_day1 INT , --【30】的输入参数
        @overdue_dayselect1 CHAR(1) , --【每日】的选择参数 1每日2每周3每两周4每月
        @overdue_sel_obj CHAR(1) , --【配偶】的选择参数
        @overdue_sel_obj1 CHAR(1) , --【担保人】的选择参数
        @overdue_sel_obj2 CHAR(1) --【所在单位】的选择参数

    DECLARE @sendtimebegin DATETIME ,     --发送时间的开始
        @handset CHAR(11) ,           --手机号码
        @smscontent VARCHAR(8000) ,   --发送内容,包含关键字
        @content VARCHAR(8000)       --发送内容,不包含关键字

    DECLARE @unit_account CHAR(13) ,
        @person_account CHAR(8) ,
        @sendtype CHAR(1)--发送类型【1单位经办人 2缴存职工 3贷款职工】

--查询相关的参数值
    SELECT  @is_gjj_remind = is_gjj_remind ,
            @is_gjj_month_remind = is_gjj_month_remind ,
            @gjj_monthselect = gjj_monthselect ,
            @gjj_day = gjj_day ,
            @is_dk_remind = is_dk_remind ,
            @is_repay_mind = is_repay_remind ,
            @repay_day = repay_day ,
            @is_overdue_remind = is_overdue_remind ,
            @overdue_day = overdue_day ,
            @overdue_dayselect = overdue_dayselect ,
            @sendmode = sendmode ,
            @is_gjj_day_remind = is_gjj_day_remind ,
            @gjj_day2 = gjj_day2 ,
            @sel_obj = sel_obj ,
            @is_overdue_remind_long = is_overdue_remind_long ,
            @overdue_day1 = overdue_day1 ,
            @overdue_dayselect1 = overdue_dayselect1 ,
            @overdue_sel_obj = overdue_sel_obj ,
            @overdue_sel_obj1 = overdue_sel_obj2 ,
            @overdue_sel_obj2 = overdue_sel_obj3
    FROM    s_para
    WHERE   belong = @belong

--准备临时表
IF OBJECT_ID('tempdb..#tmptable','u')IS NULL  加一段这个
BEGIN
    CREATE TABLE #tmptable
        (
          t_id INT ,               --ID列,保证不重复
          smstype VARCHAR(10) ,    --短信类型
          sms_send_time DATETIME , --短信预备发送时间,
          send_to VARCHAR(10) ,    --接受对象
          handset VARCHAR(11) ,
          content VARCHAR(7900)
        )
END 
--把前一天没有发送成功的短信,从草稿箱获取再重新发送。重新发送后删除草稿箱内容
    INSERT  INTO #tmptable
            SELECT  t_id ,
                    smstype ,
                    DATEADD(day, 1, sms_send_time) ,
                    send_to ,
                    handset ,
                    content
            FROM    s_draft
            WHERE   belong = @belong

    DELETE  FROM s_draft
    WHERE   belong = @belong

    DECLARE @tmp_max_id INT
    SELECT  @tmp_max_id = ISNULL(MAX(SISMSID), 1) + 1
    FROM    sms_outbox
----------------------------------进行公积金余额变动提醒:同时给单位及个人--------------------------
--思路:第二天给前一天余额有变动的单位及人员发送短信提醒
    IF @is_gjj_remind = '1'
        BEGIN
--1.给发送时间段设置值
            SELECT  @sendtimebegin = CONVERT(CHAR(11), GETDATE(), 121)
                    + SUBSTRING(b.sendtimeset, 1, 5) + ':00.000'
            FROM    s_set_sendtime a ,
                    s_sendtime b
            WHERE   a.sendtimeid = b.ID
                    AND a.belong = b.belong
                    AND a.belong = @belong
                    AND smstype = '1'

            IF CONVERT(CHAR(23), @sendtimebegin, 121) = ''
                GOTO come_here_1

--2.查询待发送的内容,包含关键字 经办人的短信
            SELECT  @sendtype = sendto ,
                    @smscontent = smscontent
            FROM    s_smsset
            WHERE   smstype = '1'
                    AND sendto = '1'
                    AND status = '7' --终审通过的短信 
                    AND belong = @belong

            IF ISNULL(@smscontent, '') = ''
                GOTO come_here_101 --无单位短信,跳转到给职工发短信

--3.查询前一天有业务的 单位帐号,手机号码
            DECLARE handset_cursor1 CURSOR
            FOR
                SELECT  a.unit_account ,
                        '' ,
                        a.handset
                FROM    m_unitinfo a
                WHERE   a.belong = @belong
                        AND a.status < '2'
                        AND dbo.f_sms_checkphone(a.handset) = 1 --验证手机号是否合法的函数
                        AND a.unit_account NOT IN ( SELECT  unit_account
                                                    FROM    s_disturb
                                                    WHERE   type = '1' ) --1.经办人短信 2.缴存职工短信 3.贷款职工短信
                        AND a.unit_account IN (
                        SELECT  unit_account
                        FROM    m_unitbusi
                        WHERE   real_date >= CONVERT(CHAR(10), DATEADD(day, -1,
                                                              GETDATE()), 121)
                                AND real_date < CONVERT(CHAR(10), GETDATE(), 121)
                                AND belong = @belong
                        UNION
                        SELECT  unit_account
                        FROM    m_personbusi
                        WHERE   real_date >= CONVERT(CHAR(10), DATEADD(day, -1,
                                                              GETDATE()), 121)
                                AND real_date < CONVERT(CHAR(10), GETDATE(), 121)
                                AND belong = @belong )

            OPEN handset_cursor1
            FETCH NEXT FROM handset_cursor1 INTO @unit_account,
                @person_account, @handset
            WHILE @@fetch_status = 0
                BEGIN
--发送内容中的关键字替换
                    EXEC sms_get_content_by_keyword @sendtype, @smscontent,
                        @belong, @unit_account, @person_account,
                        @content OUTPUT
代码过长我后面没贴

#9


还有你的那些if/else,while的,都加上begin end包住,特别是if /else,如果不加begin/end,这个对接下来的第一句有效,对第二句开始就无效

#10


代码发重了,还没发完整。

#11


代码发重了,还没发完整。

#12


begin/end这个我知道,我只是在只执行if else下面一句的情况才不加begin end的。

#13


我来猜猜看:
你的存储过程会创建一个临时表 #tmptable,插入数据。
然后调用这会向 s_auto_send_log 插入日志,标记存储过程被执行过了,并且会读取 #tmptable 表的数据做某些处理。

那么好玩的来了。
如果上层调用者还没有处理完 #tmptable 表的数据,连接意外断开了,整个 #tmptable 表就没了。
然后试图再调用存储过程,日志表已经有记录了,直接跳出,那么  #tmptable 表没有被创建,上层调用者试图从 #tmptable 表取数就会出 提示对象名“#tmptable”无效的错误了。

#14


最后是会向s_auto_send_log插入日志,但是s_auto_send_log表在建立定时任务的时候是没有数据的。

#15


对象名“#tmptable”无效 应该不是sp内而是上层调用者的错误吧。
那么很显然在某种条件下sp没有创建#tmptable。

#16


引用 15 楼 Tiger_Zhao 的回复:
对象名“#tmptable”无效 应该不是sp内而是上层调用者的错误吧。
那么很显然在某种条件下sp没有创建#tmptable。

能不能给解释下什么叫上层调用者的错误? sql数据库中建立定时任务 提示对象名“#tmptable”无效

#17


存储过程我把开始的判断删除了还是不行。
现在存储过程内除了开始定义的变量以及变量赋值,紧接着就是创建#tmptable这个临时表了。
不过还是不能新建包,依旧提示“对象名‘#tmptable’无效”

#18


你会不会上层调用跳过了sp?
加调试 PRINT 吧。

#19



引用 18 楼 Tiger_Zhao 的回复:
你会不会上层调用跳过了sp?
加调试 PRINT 吧。

上层调用跳过了sp?
我是新建包调用存储过程如何调试?

#20


个人不建议把复杂的sql搞成job, 难以维护高度, 最好是写代码做成Windows服务

如果你一定要做job, 可以把中间结果放在一个调试专用的表中保存……

#21