SQL存储过程中传入参数实现任意字段排序
2009-04-07 10:25:20 来源:WEB开发网在做一个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个字段的话(像企业信息表之类的)
- ››SQL Server 2008 R2 下如何清理数据库日志文件
- ››sqlite 存取中文的解决方法
- ››SQL2005、2008、2000 清空删除日志
- ››SQL Server 2005和SQL Server 2000数据的相互导入...
- ››sql server 2008 在安装了活动目录以后无法启动服...
- ››sqlserver 每30分自动生成一次
- ››sqlite 数据库 对 BOOL型 数据的插入处理正确用法...
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
更多精彩
赞助商链接