日期:2014-05-18  浏览次数:20475 次

求一高难度存储过程!!!请高手帮忙!
问题描述如下:
求一存储过程,要求这个存储过程有两个参数,一个是表名,一个是个数
exec   存储过程的名字   表名,个数
表A如下(表可以任意改变)
id                 a                   b                 c                 d                   e
1 面包 牛奶 尿布 啤酒 NULL
2 可乐 牛奶 尿布 NULL NULL
3 面包 可乐 牛奶 NULL NULL
4 可乐 啤酒 NULL NULL NULL
5 可乐 牛奶 尿布 花生 NULL
6 可乐 牛奶 花生 NULL NULL
7 面包 可乐 牛奶 尿布 啤酒
8 面包 牛奶 尿布 花生 啤酒
9 面包 NULL NULL NULL NULL
例如运行exec   shiyan   A,3   就删除id是2和3,6三行,运行exec   shiyan   A,1,就删除id是9的一行,依次类推。
请高手帮忙,非常谢谢!

------解决方案--------------------
create table A(id int,a varchar(6),b varchar(6),c varchar(6),d varchar(6),e varchar(6))
insert into A select 1, '面包 ', '牛奶 ', '尿布 ', '啤酒 ',NULL
insert into A select 2, '可乐 ', '牛奶 ', '尿布 ',NULL ,NULL
insert into A select 3, '面包 ', '可乐 ', '牛奶 ',NULL ,NULL
insert into A select 4, '可乐 ', '啤酒 ',NULL ,NULL ,NULL
insert into A select 5, '可乐 ', '牛奶 ', '尿布 ', '花生 ',NULL
insert into A select 6, '可乐 ', '牛奶 ', '花生 ',NULL ,NULL
insert into A select 7, '面包 ', '可乐 ', '牛奶 ', '尿布 ', '啤酒 '
insert into A select 8, '面包 ', '牛奶 ', '尿布 ', '花生 ', '啤酒 '
insert into A select 9, '面包 ',NULL ,NULL ,NULL ,NULL
go

create procedure shiyan(@tname varchar(10),@num int)
as
begin
declare @sql varchar(8000)
set @sql= ' '

select
@sql=@sql+ '+(case when '+name+ ' is null then 0 else 1 end) '
from
syscolumns
where
id=object_id(@tname) and name!= 'id '

set @sql= 'delete '+@tname+ ' where '+stuff(@sql,1,1, ' ')+ '= '+rtrim(@num)

exec(@sql)
end
go

exec shiyan 'A ',3
select * from A
/*
id a b c d e
----------- ------ ------ ------ ------ ------
1 面包 牛奶 尿布 啤酒 NULL
4 可乐 啤酒 NULL NULL NULL
5 可乐 牛奶 尿布 花生 NULL
7 面包 可乐 牛奶 尿布 啤酒
8 面包 牛奶 尿布 花生 啤酒
9 面包 NULL NULL NULL NULL
*/
go

exec shiyan 'A ',1
select * from A
/*
id a b c d e
----------- ------ ------ ------ ------ ------
1 面包 牛奶 尿布 啤酒 NULL
4 可乐 啤酒 NULL NULL NULL
5 可乐 牛奶 尿布 花生 NULL
7 面包 可乐 牛奶 尿布 啤酒
8 面包 牛奶 尿布 花生 啤酒
*/
go

drop table A
drop procedure shiyan
go
------解决方案--------------------
--三個參數的寫法
--創建存儲過程
Create ProceDure shiyan(@TableName Varchar(100), @ColName Varchar(100), @Count Int)
As
Begin
Declare @S Varchar(8000)
Select @S = ' Delete From ' + @TableName + ' Where ' + @ColName + '= ' + Rtrim(@Count)
EXEC(@S)
End
GO
--調用
exec shiyan 'B ', 'sub ', 3
Select * From B
GO


--如果只有一個int列,只有兩個參數的寫法
--創建存儲過程