日期:2014-05-19  浏览次数:20429 次

请教一个简单存储过程的写法?
存在一个表   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


这是总计不在最后的