--我的表中只有三个字段: uidID uniqueidentifier; dtDate datetime ; szDescription nvarchar(max)--方法1declare @order nvarchar(30)
set @order = 'dtDate'
SELECT *
FROM tb_products
ORDER BY
CASE @order
WHEN 'dtDate' THEN 2
WHEN 'uidID' THEN 1
WHEN 'szDescription' THEN 3
ELSE NULL END DESC
我的想法是动态传递排序列名 , 然后进行排序.
我知道下面这样语句可以正确执行:
--方法2declare @order nvarchar(30)
set @order = 'szDescription'
SELECT *
FROM tb_products
ORDER BY
CASE @order
--WHEN 'dtDate' THEN CAST(dtDate AS varchar(50))--根据 追索 的回答已经改为下面的WHEN 'dtDate' THEN Convert(varchar(10),dtDate,102)
WHEN 'uidID' THEN CAST(uidID AS varchar(50))
WHEN 'szDescription' THEN szDescription
ELSE NULL
END DESC
现在的问题是用方法2 无法找到函数列 . 有谁能告诉我方法1错哪儿了吗?
方法2问题出在这
你把WHEN 'dtDate' THEN CAST(dtDate AS varchar(50))
改成WHEN 'dtDate' THEN Convert(varchar(10),dtDate,102) 就能排序了
至于uidID我不知道你说的是什么数据类型 不过你也这样转换试
SQL SQL server 不能比较或排序 text、ntext 和 image 数据类型,除非使用 IS NULL 或 LIKE 运算符
IF NOT OBJECT_ID('[tb_products]') IS NULL
DROP TABLE [tb_products]
GO
CREATE TABLE [tb_products]
([uidID] binary(16) not null,
[dtDate] datetime null,
[szDescription] nvarchar(max) null
)
go
insert into [tb_products]
select newid(),getdate(),replicate('X',8)
union all
select newid(),dateadd(yy,-1,getdate()),replicate('A',10)
union all
select newid(),dateadd(mm,-1,getdate()),replicate('C',20)
select * from tb_products
----方法1
declare @order int
set @order = 2
SELECT *
FROM tb_products
ORDER BY
CASE @order
WHEN 1 THEN 'dtDate'
WHEN 2 then 'uidID'
WHEN 3 then 'szDescription'
ELSE 'dtdate' END DESC
--方法2
declare @order nvarchar(30)
set @order = 'szDescription'
----set @order = 'uidID'
----set @order = 'dtDate'
Declare @strSQL nvarchar(4000)
set @strSQL='SELECT * FROM tb_products ORDER BY '+ @order +' desc'
exec (@strSql)
有什么错误,报什么错。语句正确的啊。