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

2016-02-19 13:49 83 1 收藏

岁数大了,QQ也不闪了,微信也不响了,电话也不来了,但是图老师依旧坚持为大家推荐最精彩的内容,下面为大家精心准备的SQL存储过程中传入参数实现任意字段排序,希望大家看完后能赶快学习起来。

【 tulaoshi.com - 编程语言 】

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

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

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

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

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

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

  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 *

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

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

来源:http://www.tulaoshi.com/n/20160219/1605333.html

延伸阅读
标签: SQLServer
前言 一直用ASP+ACCESS来编写网页和公司的内部应用系统,内部应用系统也就是大家说的OA吧,这个我也不知道,公司又叫它ERP,反正不管什么,它是用来帮助公司处理日常工作的,简化劳动的.从来没用过存储过程,所有的添加,删除,修改都是在ASP里面写程序执行,代码很多.数据量少的时候没什么感觉,挺快的,可等到数据量大的时候,上W条记录查询,尤其是不...
最近做了个Java的小项目(第一次写Java的项目哦), 到网上搜索了半天,找到了一个比较好点的调用存储过程的例子,而且网上普遍采用的都是setXXX((int parameterIndex, XXX x)的形式。这种形式感觉不是很直观,下面就发布一个完整的采用setXXX(String parameterName, XXX x)的编写方法。创建数据表,存储过程的代码都完整发布。 创建...
收藏到:                         1:首先你需要创建一个包,并定义你返回的游标的类型、存储过程 create or replace package TEST_PKG is     -- Public type declarations   type cur_emp is R...
SQL语句如下: 代码如下: WITH 表1 AS ( SELECT 编号字段名, ROW_NUMBER() OVER(ORDER BY 排序字段名 DESC) AS RowNum FROM 表名 ) Update 表1 SET 编号字段名=RowNum 应用场景: 通过这样的SQL语句根据小组人气值对小组进行排名: 代码如下: WITH groups AS ( SELECT RankNum, ROW_NUMBER() OVER(ORDER BY 人气值 DESC) A...
存储过程功能的优点 为什么要使用存储过程?以下是存储过程技术的几大主要优点: 预编译执行程序。SQL Server只需要对每一个存储过程进行一次编译,然后就可以重复使用执行计划。这个特点通过重复调用存储程序极大地提高了程序的性能。 缩短客户端/服务器之间的信息传输量。如果你的工作环境带宽有限,那么存储过程技术肯定能够满...

经验教程

722

收藏

16
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部