SQL存储过程中传入参数实现任意字段排序

在做一个project的时候,要对表实现任意的排序,说得明白点就是这样:

在存储过程中声明一个@parameter,然后在使用查询条件后的排序,要根据我的@parameter来实现,而我这个@parameter实际传进去的就是一个字段值。

网上Google了一下,发现有这样的例子,大多数都是以普提树的多字段任意分页的存储过程结合在一起,看起来好不复杂,而我现在没必要搞分页,没有办法实现吗???

我先按常理搞了一个这样的:

select * from SiteDetailInfo where SiteBasicId = SiteId And SiteIsCheck = 1 order by  @Parameter desc


在查询分析器中运行报错:


ORDER BY 子句所标识的第 %1! 个 SELECT 项包含了一个变量,该变量位于标识列位置的表达式中。只有排序依据表达式引用的是列名时,才允许在该表达式中使用变量。


好像语法上有问题,这是意料之中的,隐约记得应该加上单引号之类的,问了一下网友史帝尔,很快就丢过答案过来了,果然是有点语法上的问题.

修正如下:

create   procedure   proc_test
@fieldname   varchar(50)
as

declare   @sql   varchar(1000)
set   @sql= "update   [table]   set   "   +   @fieldname   +   "= "   +   @fieldname   +   "+1 "
exec(@sql)

go


或者:

declare   @field   varcahr(10)
update   table   (case   @field   when   "字段1名 "   then   set   字段1   =   字段1   +   1  
                                                    when   "字段2名 "   then   set   字段2   =   字段2   +   1
                                                    ....   end)


再在查询分析器中F5一下,OK,没报错了。happy

不料,让老朋友分析了一下,提醒这样风险比较大,容易出错,应该有更周全的写法,当然不能错过,不多长时间得到下面的语句:

SELECT *

FROM Shippers

ORDER BY

CASE @ColName WHEN 'ShipperID'

THEN ShipperID ELSE NULL END,

CASE @ColName WHEN 'CompanyName'

THEN CompanyName ELSE NULL END,

CASE @ColName WHEN 'Phone'

THEN Phone ELSE NULL END



哇噻,不错不错,这样考虑得很周全喔,不过我这表中有20来个字段,难道要一个一个去Case吗?哈哈,哈哈,自己权衡两种方法的利弊吧。

第一种方法:比较简单,但是如果字段值出错的话,那就容易出错的了,这个问题应该可以在你程序中写死你在表中的字段的吧。
第二种方法:比较周全,当然,如果你一个表有10个以上的字段,要你一个一个去Case的话,那就不知你能不能顶得住了,假如有50个字段的话(像企业信息表之类的)[em13][em13]


请大家多多指教:)

  




[本日志由 admin 于 2008-05-10 11:05 PM 编辑]
上一篇: Net生成手机号码图片
下一篇: Web技术期刊2007年第6期(总第19期)
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
相关日志:
评论: 0 | 引用: 0 | 查看次数: 25464
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 30 字 | UBB代码 关闭 | [img]标签 关闭