首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求一高难度存储过程!请高手帮忙!解决方案

2012-02-06 
求一高难度存储过程!!!请高手帮忙!问题描述如下:求一存储过程,要求这个存储过程有两个参数,一个是表名,一

求一高难度存储过程!!!请高手帮忙!
问题描述如下:
求一存储过程,要求这个存储过程有两个参数,一个是表名,一个是个数
exec   存储过程的名字   表名,个数
表A如下(表可以任意改变)
id                 a                   b                 c                 d                   e
1面包牛奶尿布啤酒NULL
2可乐牛奶尿布NULLNULL
3面包可乐牛奶NULLNULL
4可乐啤酒NULLNULLNULL
5可乐牛奶尿布花生NULL
6可乐牛奶花生NULLNULL
7面包可乐牛奶尿布啤酒
8面包牛奶尿布花生啤酒
9面包NULLNULLNULLNULL
例如运行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列,只有兩個參數的寫法
--創建存儲過程
Create ProceDure shiyan(@TableName Varchar(100), @Count Int)


As
Begin
Declare @S Varchar(8000)
Select @S = ' Delete From ' +@TableName + ' Where ' + Name + '= ' + Rtrim(@Count) From SysColumns Where ID = OBJECT_ID(@TableName) And Xtype = 56
EXEC(@S)
End
GO
--調用
exec shiyan 'B ', 3
Select * From B

热点排行