差不多的:
Declare @OrderBy smallint
Declare @t table(a1 int,a2 int,a3 varchar(10))
insert into @t
select 1,2,'3'
union all select 2,3,'4'
union all select 3,3,'3'
union all select 6,4,'3'
union all select 2,5,'7'--测试1
set @OrderBy=1
select * from @t
order by case @OrderBy
when 1 then a1 
when 2 then a2
when 3 then a3 end
desc--测试2
set @OrderBy=2
select * from @t
order by case @OrderBy
when 1 then a1
when 2 then a2
when 3 then a3 end
desc--测试3
set @OrderBy=3
select * from @t
order by case @OrderBy
when 1 then a1
when 2 then a2
when 3 then a3 end
desc

解决方案 »

  1.   

    1.如果是a1,a2,a3都是varchar列呢?
    处理方法一样.--下面是测试
    Declare @OrderBy smallint
    Declare @t table(a1 varchar(1),a2 varchar(1),a3 varchar(1))
    insert into @t
    select 'a','b','c'
    union all select '2','a','4'
    union all select '3','3','3'
    union all select '6','b','a'--测试1
    set @OrderBy=1
    select * from @t
    order by case @OrderBy
    when 1 then a1
    when 2 then a2
    when 3 then a3 end--测试2
    set @OrderBy=2
    select * from @t
    order by case @OrderBy
    when 1 then a1
    when 2 then a2
    when 3 then a3 end--测试3
    set @OrderBy=3
    select * from @t
    order by case @OrderBy
    when 1 then a1
    when 2 then a2
    when 3 then a3 end/*--测试结果--测试1
    a1   a2   a3   
    ---- ---- ---- 
    2    a    4
    3    3    3
    6    b    a
    a    b    c(所影响的行数为 4 行)--测试2
    a1   a2   a3   
    ---- ---- ---- 
    3    3    3
    2    a    4
    a    b    c
    6    b    a(所影响的行数为 4 行)--测试3
    a1   a2   a3   
    ---- ---- ---- 
    3    3    3
    2    a    4
    6    b    a
    a    b    c(所影响的行数为 4 行)--*/
      

  2.   

    第二个问题是数字就好办了.字符真不好办.--数字可以用:
    set @OrderBy=3
    select * from @t
    order by case @OrderBy
    when 1 then a1
    when 2 then a2
    when 3 then 2147483647-a3    --假设这个需要倒序,一个足够大的数减它就行
        end