求一高难度存储过程!!!请高手帮忙!

Jackie_GP 2007-04-13 04:50:41
问题描述如下:
求一存储过程,要求这个存储过程有两个参数,一个是表名,一个是个数
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的一行,依次类推。
请高手帮忙,非常谢谢!
...全文
1736 点赞 收藏 55
写回复
55 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
terryhuang 2007-04-17
学习。。。。。。
回复
dcbr4 2007-04-16
周老大走了说
回复
paoluo 2007-04-14
Jackie_GP(欲让其灭亡,先让其疯狂) ( ) 信誉:100 Blog 加为好友 2007-4-13 20:46:44 得分: 0



Xtype = 56去掉也可以呀!



---------------
對,在這種特殊情況下的確是可以, 因為你的第一列就是那個int列。

如果第一列不是你那個int列,就會有問題了。
回复
Jackie_GP 2007-04-13
Xtype = 56去掉也可以呀!
回复
paoluo 2007-04-13
得到類型為int的字段名, int對應的xtype為56。
回复
Jackie_GP 2007-04-13
现在好了,我会给分的,请paoluo(一天到晚游泳的鱼) 和libin_ftsafe(子陌红尘)进,我发的所有没有结的帖子,我给分。
回复
Jackie_GP 2007-04-13
Xtype = 56是什么意思?
回复
paoluo 2007-04-13
--三個參數的寫法
--創建存儲過程
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
回复
paoluo 2007-04-13
--如果只有一個int列

Create Table B
(sub Int,
a Nvarchar(10),
b Nvarchar(10))
GO
Insert B Select 3, N'花生', N'牛奶'
Union All Select 3, N'可乐', N'尿布'
Union All Select 5, N'可乐', N'牛奶'
Union All Select 3, N'面包', N'尿布'
Union All Select 4, N'面包', N'牛奶'
Union All Select 3, N'面包', N'啤酒'
Union All Select 5, N'尿布', N'牛奶'
Union All Select 3, N'尿布', N'啤酒'
Union All Select 3, N'牛奶', N'啤酒'
GO
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
GO
Drop Table B
Drop ProceDure shiyan
--Result
/*
sub a b
5 可乐 牛奶
4 面包 牛奶
5 尿布 牛奶
*/
回复
Jackie_GP 2007-04-13
三个参数也行,只要三个参数都是动态的就行。
回复
paoluo 2007-04-13
--上面存儲過程有點bug

Create Table B
(sub Int,
a Nvarchar(10),
b Nvarchar(10))
GO
Insert B Select 3, N'花生', N'牛奶'
Union All Select 3, N'可乐', N'尿布'
Union All Select 5, N'可乐', N'牛奶'
Union All Select 3, N'面包', N'尿布'
Union All Select 4, N'面包', N'牛奶'
Union All Select 3, N'面包', N'啤酒'
Union All Select 5, N'尿布', N'牛奶'
Union All Select 3, N'尿布', N'啤酒'
Union All Select 3, N'牛奶', N'啤酒'
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
Drop Table B
Drop ProceDure shiyan
--Result
/*
sub a b
5 可乐 牛奶
4 面包 牛奶
5 尿布 牛奶
*/





回复
paoluo 2007-04-13
Jackie_GP(欲让其灭亡,先让其疯狂) ( ) 信誉:100 Blog 加为好友 2007-04-13 17:56:35 得分: 0


paoluo(一天到晚游泳的鱼) 和libin_ftsafe(子陌红尘) 的第二个存储过程都有点小问题,我要求存储过程的两个参数都是动态的(表的列名是动态的)。
请二位高手再次帮忙,非常谢谢!!!


------
你刪除做判斷的列名必須可以確定下來。

要麼像我上面那樣,有三個參數。

或者你的表只有一個int列,也可以。
回复
paoluo 2007-04-13
--列名也是作為一個參數? 那這麼寫

--如果固定有sub列
Create Table B
(sub Int,
a Nvarchar(10),
b Nvarchar(10))
GO
Insert B Select 3, N'花生', N'牛奶'
Union All Select 3, N'可乐', N'尿布'
Union All Select 5, N'可乐', N'牛奶'
Union All Select 3, N'面包', N'尿布'
Union All Select 4, N'面包', N'牛奶'
Union All Select 3, N'面包', N'啤酒'
Union All Select 5, N'尿布', N'牛奶'
Union All Select 3, N'尿布', N'啤酒'
Union All Select 3, N'牛奶', N'啤酒'
GO
Create ProceDure shiyan(@TableName Varchar(100), @ColName Varchar(100), @Count Int)
As
Begin
Declare @S Varchar(8000)
Select @S = ' Delete From B Where ' + @ColName + '= ' + Rtrim(@Count)
EXEC(@S)
End
GO
exec shiyan 'B', 'sub', 3
Select * From B
GO
Drop Table B
Drop ProceDure shiyan
--Result
/*
sub a b
5 可乐 牛奶
4 面包 牛奶
5 尿布 牛奶
*/




回复
Jackie_GP 2007-04-13
paoluo(一天到晚游泳的鱼) 和libin_ftsafe(子陌红尘) 的第二个存储过程都有点小问题,我要求存储过程的两个参数都是动态的(表的列名是动态的)。
请二位高手再次帮忙,非常谢谢!!!
回复
Jackie_GP 2007-04-13
我要的这两个存储过程,要求两个参数都是动态的。
回复
Jackie_GP 2007-04-13
我只是举个例子,并且我的这里列名也是sub,要求两个参数都是动态的,
回复
子陌红尘 2007-04-13
你确认表中有sub这个列名?
回复
Jackie_GP 2007-04-13
我试着怎么有点错误?
错误如下
服务器: 消息 207,级别 16,状态 3,行 1
列名 'sub' 无效。
回复
Jackie_GP 2007-04-13
上面的有一点错误
回复
子陌红尘 2007-04-13
暈,又慢了,早知道我先貼出存儲過程了.
--------------------------------------------------
呵呵,我先贴的那个又有BUG.
回复
加载更多回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2007-04-13 04:50
社区公告
暂无公告