请教一个简单存储过程的写法?
存在一个表 Route:
ID RouteName
1 上门
2 电话
3 短信
4 杂志
5 户外广告
...
通过此表的数据创建下表的存储过程如何写?
表名:Log
ID DATE 上门 电话 短信 杂志 户外广告 总计
1 2007-3-8 5 8 4 0 3 20
2 ...
另:使用中文做字段名没什么问题吧?
------解决方案--------------------假设log表中有个日期字段名为date
create proc GetLog
as
BEGIN
declare @sql nvarchar(4000)
set @sql = 'select [date] '
select @sql = @sql + ',sum(case when datediff(d,[date], ' ' ' + convert(varchar(10),[date]) + ' ' ') = 0 then 1 else 0 end) as ' + RouteName
from log
select @sql = @sql + ' from log group by [date] '
exec (@sql)
end
------解决方案--------------------那个,LZ的意思是想通过一张表建立另一张表吧
把一张表里存储的数据拿出来作为另一张表的字段
慕白兄会错意了吧
------解决方案--------------------似乎很麻烦,存储过程里建表是可以
我从Route表里把这些数据取出来
作为另一张表的字段的时候
我怎么知道数据类型是什么呢?
难道再写个函数?
if @name = '短信 '
begin
set @type = 'nvarchar(50) '
end
return @type
。
。
。
然后再在存储过程里再这样
set @sql= 'alter table add '+@name+ ' '+@type+ ' '
exec(@sql)
这样???
------解决方案-------------------- declare @sql varchar(2000)
if not exists(select 1 from sysobjects where name = 'log ' and xtype = 'u ')
begin
set @sql = ' create table log(id int ,date datetime '
select @sql = @sql + ', '+ routename + ' int ' from route
set @sql = @sql + ',总计 int ) '
execute (@sql)
end
else
begin
declare rs cursor for select RouteName from Route
where RouteName not in(
select B.name from sysobjects as A
inner join syscolumns as B on A.id = B.id
where A.name = 'log ' and A.xtype = 'u ' )
declare @name nvarchar(20)
open rs
fetch next from rs into @name
while @@fetch_status = 0
begin
exec( 'alter table log add ' + @name + ' int ')
fetch next from rs into @name
end
close rs
deallocate rs
end
这是总计不在最后的