--动态创建存储过程的示例:
create proc p_test()
as
if object_id('要动态创建的存储过程名') is not null 
  drop proc 要动态创建的存储过程名
exec('create proc 要动态创建的存储过程名
as
....
')
go

解决方案 »

  1.   

    1。由于计算的项目不是固定的,可以修改删除添加,如何动态创建存储过程,如何保持一致?
    可以用exec:
    declare @sql nvarchar(1000)
    set @sql=N'@a='+'345+345*4/1'
    exec sp_executesql @sql,N'@a int output',@a output
    select @a 结果
    2。作业调度中如何保证调用的是创建的那些存储过程的全部,也就是说作业调度的对象也是动态的?你可以只调度一个对象,而这个对象根据不同情况动态调用其他对象。
      

  2.   


    http://expert.csdn.net/Expert/topic/2323/2323708.xml?temp=.2692224
    我用sql server数据库,库中有如下两表。
    表t1保存不同类型人员在消费时的折扣计算公式及奖励积分计算公式,如下:
    类型          折扣价                         积分
    一般会员    本次消费额* 0.95          积分+round(本次消费额/1000)
    白银会员    本次消费额* 0.9            积分+round(本次消费额/1000)
    黄金会员    本次消费额* 0.85          积分+round(本次消费额/1000)
    钻石会员    本次消费额* 0.8            积分+round(本次消费额/1000)表t2中保存人员的消费情况,并要根据t1中各对应字段公式计算其结果,如下:
    会员编号   类型             本次消费额        折扣价          积分
    002         白银会员           1520.00              0               0
    005         黄金会员           3300.00              0               0
    007         一般会员             350.00              0               0
    034         钻石会员             520.00              0               0
    002         白银会员             780.00              0               0如上两表,在sql server查询分析器里我想用t1表中的公式直接用update命令计算出t2表中对应字段的值。命令如下:update t2 set 折扣价=t1.折扣价,积分=t1.积分 from t1,t2 where t1.类型=t2.类型可是执行时却提示说数据类型转换出错,因为t1表中的折扣价字段和积分字段为char型,保存的计算公式,可在t2表中的折扣份和积分字段却为数值型,所以出错。本人要如何才能实现如上算法。请高人们帮我看看我应如何做!查了一夜sql书也找不到办法,只能求教各位了。
    *******************
    create table #t1(类型 varchar(8),折扣价 varchar(100),积分 varchar(100))
    insert #t1 select 
    '一般会员','本次消费额*0.95','积分+round(本次消费额/1000,0)'
    Union all select 
    '白银会员','本次消费额*0.9','积分+round(本次消费额/1000,0)'
    Union all select 
    '黄金会员','本次消费额*0.85','积分+round(本次消费额/1000,0)'
    Union all select 
    '钻石会员','本次消费额*0.8','积分+round(本次消费额/1000,0)'create table #t2(会员编号 char(3),类型 varchar(8),本次消费额 numeric(10,2),折扣价 numeric(10,2),积分 int)
    insert #t2 select
    '002','白银会员',1520.00,     0,      0
    union all select 
    '005','黄金会员',3300.00,     0,      0
    union all select 
    '007','一般会员',350.00,     0 ,     0
    union all select 
    '034','钻石会员',520.00,     0 ,     0
    union all select 
    '002','白银会员',780.00,     0 ,     0
    declare @a char(100),@b varchar(100),@c varchar(100)declare cur cursor for select * from #t1
    open curfetch next from cur into @a,@b,@cwhile @@fetch_status = 0
    begin
      exec('update #t2 set 折扣价='+@b+',积分='+@c+' where 类型='''+@a+'''')
    fetch next from cur into @a,@b,@c
    end
    close cur
    deallocate curSelect * from #t2
    go
    drop table #t1,#t2
      

  3.   

    --下面的存储过程可以实现动态创建作业./*--创建作业--邹建 2003.10--*//*--调用示例--每月执行的作业
    exec p_createjob @jobname='mm',@sql='select * from syscolumns',@freqtype='month'--每周执行的作业
    exec p_createjob @jobname='ww',@sql='select * from syscolumns',@freqtype='week'--每日执行的作业
    exec p_createjob @jobname='a',@sql='select * from syscolumns'--每日执行的作业,每天隔4小时重复的作业
    exec p_createjob @jobname='b',@sql='select * from syscolumns',@fsinterval=4--*/
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_createjob]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[p_createjob]
    GOcreate proc p_createjob
    @jobname nvarchar(100), --作业名称
    @sql varchar(8000), --要执行的命令
    @dbname sysname='', --默认为当前的数据库名
    @freqtype varchar(6)='day', --时间周期,month 月,week 周,day 日
    @fsinterval int=1, --相对于每日的重复次数
    @time int=170000, --开始执行时间,对于重复执行的作业,将从0点到23:59分
    @deletejob bit=1 --如果有同名的作业,则删除它
    as
    if isnull(@dbname,'')='' set @dbname=db_name()--如果同名的作业已经存在,则删除它
    if @deletejob=1 and exists(SELECT 1 from msdb..sysjobs where name=@jobname)
    EXECUTE msdb.dbo.sp_delete_job @job_name=@jobname --创建作业
    exec msdb..sp_add_job @job_name=@jobname--创建作业步骤
    exec msdb..sp_add_jobstep @job_name=@jobname,
    @step_name = '数据处理',
    @subsystem = 'TSQL',
    @database_name=@dbname,
    @command = @sql,
    @retry_attempts = 5, --重试次数
    @retry_interval = 5  --重试间隔--创建调度
    declare @ftype int,@fstype int,@ffactor int
    select @ftype=case @freqtype when 'day' then 4
    when 'week' then 8
    when 'month' then 16 end
    ,@fstype=case @fsinterval when 1 then 0 else 8 end
    if @fsinterval<>1 set @time=0
    set @ffactor=case @freqtype when 'day' then 0 else 1 endEXEC msdb..sp_add_jobschedule @job_name=@jobname, 
    @name = '时间安排',
    @freq_type=@ftype ,   --每天,8 每周,16 每月
    @freq_interval=1, --重复执行次数
    @freq_subday_type=@fstype, --是否重复执行
    @freq_subday_interval=@fsinterval,  --重复周期
    @freq_recurrence_factor=@ffactor,
    @active_start_time=@time   --下午17:00:00分执行go