我试图在SQL中创建一个排序函数,但我不能让这个东西工作。我真的试图在Stackoverflow上找到一些类似的问题,但非似乎解决了我的问题。我真的不是这方面的专家,所以希望我的解释是可以理解的。
所以案例如下:我将列出网站上的产品我有链接供用户点击,决定将要排序的内容,ProductName,ProductID等。选择的排序类型是从request.querystring
收集的,我使用CreateParameter
来避免SQL注入的风险。
这是(简化的)SQL:
"SELECT * FROM Product" & _
"ORDER BY CASE ? " & _
"WHEN 'ID' THEN ProductID " & _
"WHEN 'IDART' THEN ArticleNumber " & _
"ELSE ProductName " & _
"END DESC"
objConnProdList.CommandType = 1
SET objParam = objConnProdList.CreateParameter("@strOrder", adVarchar, adParamInput, 10, "%" & request.querystring("OrderBy") & "%")
使用ELSE
我将收到错误消息:
转换nvarchar值时转换失败' DiningChair'数据类型int。
答案 0 :(得分:1)
问题是您不能在单个案例中混合使用不同的数据类型。如果将值转换为nvarchars,语法就可以了,但是这不能正确排序。
如果您在示例中使用动态SQL,只需按实际需要添加行即可。如果你有一个存储过程或类似的东西,它可以使用单独的order by子句:
SELECT * FROM Product
ORDER BY
CASE @xxx WHEN 'ID' then ProductID end,
case @xxx WHEN 'IDART' THEN ArticleNumber end,
ProductName DESC
答案 1 :(得分:0)
我认为你让它变得过于复杂。
var sql = "SELECT * FROM Product";
switch (strOrder)
case when "ID":
sql = sql & " ORDER BY ProductID"
break;
case when "IDART":
sql = sql & " ORDER BY ArticleID"
break;
end;
然后运行它。因为没有你注射的变量,没有注射的地方。
答案 2 :(得分:0)
这是JamesZ答案的变体:
with const as (
select ? as xxx
)
SELECT *
FROM const cross join Product
ORDER BY (CASE xxx WHEN 'ID' then ProductID end),
(case xxx WHEN 'IDART' THEN ArticleNumber end),
ProductName DESC