SQL存储过程中的排序问题

fengjijia 2007-01-12 11:14:08
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[获得_列表]
@按列名排序 int,
@排序方法 int --0:升序 1:降序
AS
BEGIN
--正确的:
SELECT
....(中间部分省略)....
ORDER BY
case @按列名排序 when 0 then a.回贴时间 when 1 then a.创建时间 end DESC

/*不正确的:
SELECT
....(中间部分省略)....
ORDER BY
case @按列名排序 when 0 then a.回贴时间 when 1 then a.创建时间 end
case @排序方法 when 0 then asc when 1 then desc end
*/
END

问题是:我想在存储过程中实现对列的升序还是降序的控制(我不想用SQL字符串的方式,那样的话,还不如在程序里组织SQL语句方便,我们用存储过程就是为了提高效率嘛),但是我没能实现(参看不正确部分),高手别笑我,希望帮帮我。
...全文
597 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
mengmou 2007-01-12
  • 打赏
  • 举报
回复
--试试,好了
order by
case when @按列名排序 = 0 and @排序方法 = 0 then a.回贴时间
when @按列名排序 = 1 and @排序方法 = 0 then a.创建时间 end asc
,
case when @按列名排序 = 0 and @排序方法 = 1 then a.回贴时间
when @按列名排序 = 1 and @排序方法 = 1 then a.创建时间 end desc

多写了一个else
fengjijia 2007-01-12
  • 打赏
  • 举报
回复
mengmou()mengmou() 你给方法我在 查寻分析器中报错:

在关键字 'when' 附近有语法错误。

错误是: case when @按列名排序 = 0 and @排序方法 = 0 then a.最后回贴时间 else when @按列名排序 = 1 and @排序方法 = 0 then a.创建时间 end asc
mengmou 2007-01-12
  • 打赏
  • 举报
回复
就是把你的order by 改成我那样就可以了。
fengjijia 2007-01-12
  • 打赏
  • 举报
回复
mengmou()mengmou() 你能不能写的更详细一些
xiequanqin 2007-01-12
  • 打赏
  • 举报
回复
desc 不能动态的(除非用ESEC)

我上面的也不行??

ALTER PROCEDURE [dbo].[获得_列表]
@按列名排序 int,
@排序方法 int --0:升序 1:降序
AS
BEGIN
IF @排序方法=0
THEN
SELECT
....(中间部分省略)....
ORDER BY
(case @按列名排序 when 0 then a.回贴时间 when 1 then a.创建时间 end) DESC
ELSE
SELECT
....(中间部分省略)....
ORDER BY
(case @按列名排序 when 0 then a.回贴时间 when 1 then a.创建时间 end) asc

END
mengmou 2007-01-12
  • 打赏
  • 举报
回复
试了一下gc_ding(施主,给个妞泡好么)的竟然不对,我的才是对的
mengmou 2007-01-12
  • 打赏
  • 举报
回复
不会吧gc_ding(施主,给个妞泡好么)的是最佳答案啊。
fengjijia 2007-01-12
  • 打赏
  • 举报
回复
以上的都不对啊,我在程序中是用的

conn.open "获得_列表 "&OrderName&","OrderType,conn,3,1

打开的记录集,如果用If..else.. 语句 就取不记录集了
mengmou 2007-01-12
  • 打赏
  • 举报
回复
看了楼上的很郁闷,我咋这么笨呢?
gc_ding 2007-01-12
  • 打赏
  • 举报
回复
try:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[获得_列表]
@按列名排序 int,
@排序方法 int --0:升序 1:降序
AS
BEGIN
SELECT
....(中间部分省略)....
ORDER BY
case
when @排序方法=0 and @按列名排序=0 then a.回贴时间
when @排序方法=1 and @按列名排序=0 then a.回贴时间 desc
when @排序方法=0 and @按列名排序=1 then a.创建时间
when @排序方法=1 and @按列名排序=1 then a.创建时间 desc
end
END
mengmou 2007-01-12
  • 打赏
  • 举报
回复
--试试
order by
case when @按列名排序 = 0 and @排序方法 = 0 then a.回贴时间
else when @按列名排序 = 1 and @排序方法 = 0 then a.创建时间 end asc
,
case when @按列名排序 = 0 and @排序方法 = 1 then a.回贴时间
else when @按列名排序 = 1 and @排序方法 = 1 then a.创建时间 end desc

xiequanqin 2007-01-12
  • 打赏
  • 举报
回复
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[获得_列表]
@按列名排序 int,
@排序方法 int --0:升序 1:降序
AS
BEGIN
IF @排序方法=0
THEN
SELECT
....(中间部分省略)....
ORDER BY
(case @按列名排序 when 0 then a.回贴时间 when 1 then a.创建时间 end) DESC
ELSE
SELECT
....(中间部分省略)....
ORDER BY
(case @按列名排序 when 0 then a.回贴时间 when 1 then a.创建时间 end) asc

END
xluzhong 2007-01-12
  • 打赏
  • 举报
回复
用动态sql

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧