簡體   English   中英

如何根據條件在tSQL中動態添加SELECT語句中的列?

[英]How to add column in SELECT statement dynamically in tSQL based on condition?

我正在創建帶有parameterstSql ,並且基於某種條件,我想在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM