好久没有写存储过程了,尽管以前很热衷于这个玩意,觉得它对速度进行了优化。但自从意识到,数据库一旦变动,会导致大量的存储过程要重写,况且已经见识到持久化框架是如何优雅地与数据库交互的,便对存储过程更是冷淡。
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
当然,执行语句还是不变,即能返回数据了。