[英]How to add column in SELECT statement dynamically in tSQL based on condition?
我正在创建带有parameters
的tSql
,并且基于某种条件,我想在SELECT语句中添加列,但不确定如何执行此操作。
我的逻辑:
var keywordClause = keyword.IsNotEmpty()
? "[Name] like '%" + keyword + "%'"
: "1 = 1";
// keywordClause = "[Name] like '%Test%'"
var orderBy = sortParameters.ToOrderBy();
// orderBy = "Name ASC"
var parameters = new List<SqlParameter>
{
new SqlParameter("@Keyword", keywordClause),
new SqlParameter("@OrderBy", orderBy)
};
var sql = string.Format(@"SELECT Id,
Name,
CreateDateTime Created
FROM CallCenter WITH (NOLOCK)
WHERE(IsDeleted = 0)
AND @Keyword
ORDER BY @OrderBy");
return _PageList(ctx => ctx.CallCenterSummaries.SqlQuery(sql, parameters.ToArray())
.AsQueryable()
.Select(d => d.TrimSpaces()), page, pageSize);
根据我的逻辑,我期望这个查询:
SELECT Id,
Name,
CreateDateTime Created
FROM CallCenter WITH (NOLOCK)
WHERE(IsDeleted = 0)
AND [Name] like '%Test%'
ORDER BY Name ASC;
在这里,我得到的是"An expression of non-boolean type specified in a context where a condition is expected, near 'ORDER'."
例外,并且我认为它将Name
作为字符串。 如何获得理想的结果?
您不能将SqlParameter
作为整个子句使用-它必须在子句的右侧。 对于您的方案-以下应该工作。
var parameters = new List<SqlParameter>
{
new SqlParameter("@Keyword", keyword.IsNotEmpty() ? keyword : "%")
};
var sql = string.Format($@"SELECT Id,
Name,
CreateDateTime Created
FROM CallCenter WITH (NOLOCK)
WHERE(IsDeleted = 0)
AND [Name] like @Keyword
ORDER BY {orderBy}");
编辑:我已经编辑我的代码示例以使用order by作为插值字符串中的值而不是SqlParameter
,但是,如果orderBy
的值受用户输入的影响,这确实使您可以进行Sql注入。
另外,我建议不要在查询中使用ORDER BY
子句,并且在将结果传递回显示之前在内存中对结果进行排序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.