WEB开发网
开发学院数据库MSSQL Server SQL存储过程中传入参数实现任意字段排序 阅读

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

 2009-04-07 10:25:20 来源:WEB开发网   
核心提示:在做一个project的时候,要对表实现任意的排序,SQL存储过程中传入参数实现任意字段排序,说得明白点就是这样:在存储过程中声明一个@parameter,然后在使用查询条件后的排序,如果你一个表有10个以上的字段,要你一个一个去Case的话,要根据我的@parameter来实现,而我这个@parameter实际传进去

在做一个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个字段的话(像企业信息表之类的)

Tags:SQL 存储 过程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接