【发布时间】:2021-09-28 23:24:45
【问题描述】:
我正在尝试编写一个查询,其中将“排序”变量传递到 ORDER BY 语句中,并收到以下错误:
由 ORDER BY 编号 1 标识的 SELECT 项包含一个变量,作为标识列位置的表达式的一部分。只有在通过引用列名的表达式进行排序时才允许使用变量。
以下代码是我将变量传递给ORDER BY 子句并传入值的地方。
public async Task<IEnumerable<Export>> GetUserExports(Guid userId, ExportsListsSortType sort)
{
var selectQuery = "SELECT * FROM [dbo].[Exports]" \r\n
selectQuery += " WHERE [UserId] = @UserId \r\n";
selectQuery += " ORDER BY @Sort \r\n ";
return await conn.QueryAsync<Export>selectQuery, new { Sort = GetSortColumn((ExportsListsSortType)sort) });
}
以下代码显示了GetSortColumn 方法,该方法根据传入的排序确定要排序的列:
public string GetSortColumn(ExportsListsSortType sort)
{
switch(sort)
{
case (ExportsListsSortType.RunDateAsc):
return "CreateDate ASC";
case (ExportsListsSortType.RunDateDesc):
return "CreateDate DESC";
case (ExportsListsSortType.TemplateNameAsc):
return "ReportTitle ASC";
case (ExportsListsSortType.TemplateNameDesc):
return "ReportTitle DESC";
default:
return " CreateDate DESC";
}
}
我意识到将变量传递到 ORDER BY 子句可能会变得很棘手,并且似乎无法弄清楚这一点。
我怎样才能做到这一点?
【问题讨论】:
-
不带参数(至少不带大多数 SQL 引擎。您必须动态构建 SQL 语句。但不要放弃参数 - 只需注入 WHERE 列(使用适当的 SQL-注入预防技术)并继续为
WHERE子句使用参数
标签: c# sql variables sql-order-by