首页 新闻 搜索 专区 学院

这段T-SQL语句有什么错误吗,为什么不能正确执行?

0
悬赏园豆:15 [已解决问题] 解决于 2010-12-13 15:42

 

--我的表中只有三个字段: uidID uniqueidentifier; dtDate datetime ; szDescription nvarchar(max)


--方法1
declare @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

 

 

我的想法是动态传递排序列名 , 然后进行排序.

我知道下面这样语句可以正确执行:

 


--方法2
declare @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错哪儿了吗?

问题补充: 我把szDescription 类型描述错了,现在已经将szDescription 改为nvarchar(max)
eofaieeiwf的主页 eofaieeiwf | 初学一级 | 园豆:105
提问于:2010-12-07 15:44
< >
分享
最佳答案
0

方法2问题出在这

  你把WHEN 'dtDate' THEN CAST(dtDate AS varchar(50))

  改成WHEN 'dtDate' THEN Convert(varchar(10),dtDate,102) 就能排序了

  至于uidID我不知道你说的是什么数据类型 不过你也这样转换试

收获园豆:15
追索 | 小虾三级 |园豆:625 | 2010-12-07 18:26
你给的我测试了 可行 :) 对了 uidID 类型就是uniqueidentifier类型对应到程序中就是guid类型了
eofaieeiwf | 园豆:105 (初学一级) | 2010-12-08 12:26
其他回答(2)
0

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)

 

邀月 | 园豆:25475 (高人七级) | 2010-12-07 16:21
你说的没错,但是如果是这个原因的话,那么第二个方法也应该报错才是。
支持(0) 反对(0) 顾晓北 | 园豆:10819 (专家六级) | 2010-12-07 16:36
@顾晓北:第一个语句排序字段错!重新修改了,请看上面代码!
支持(0) 反对(0) 邀月 | 园豆:25475 (高人七级) | 2010-12-08 09:42
我看了下你的方法一 并测试执行了 你的这个方法不可行 你自己测试下用set @order = 1测试下 不会是按dtDate列降序排列 方法二是拼字符串 不是我想要的 : )
支持(0) 反对(0) eofaieeiwf | 园豆:105 (初学一级) | 2010-12-08 12:20
0

有什么错误,报什么错。语句正确的啊。

阿松 | 园豆:601 (小虾三级) | 2010-12-07 16:54
没有报错 但就是不能按传进去的参数 排序
支持(0) 反对(0) eofaieeiwf | 园豆:105 (初学一级) | 2010-12-07 17:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册