实现列名作为存储过程参数

2009-07-24  籽藤 

 好久没有写存储过程了,尽管以前很热衷于这个玩意,觉得它对速度进行了优化。但自从意识到,数据库一旦变动,会导致大量的存储过程要重写,况且已经见识到持久化框架是如何优雅地与数据库交互的,便对存储过程更是冷淡。

 sorry,我废话太多,马上进入主题。

 有位同学想用存储过程实现:客户端传一个参数,这个参数是一个列名,而后对这一列进行Like模糊查询。很显然,这种简单的写法是查询不到数据的:

=========存储过程=================

Create PROCEDURE test 
 @pName  varchar(20),
 @content varchar(20)
AS
BEGIN
 select * from Person where @pName like '%'+@content+'%'
END

=======执行语句===============

declare @pName varchar(20),@c varchar(20)
set @pName='name'
set @c='J'
exec test @pName,@c 

存储过程顺利创建,执行语句也没问题,可就是没有返回数据。

原因是:默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。

So,百度一下后,解决方案如下:

==========存储过程===========

Alter PROCEDURE test 
 @pName  varchar(20),
 @content varchar(20)
AS
BEGIN
 declare @sql varchar(20)
set @sql='select * from Person where '+@pName+'like '+'%'+@content+'%'
exec(@sql)
END

当然,执行语句还是不变,即能返回数据了。

439°/4390 人阅读/0 条评论 发表评论

登录 后发表评论