【问题标题】:Incorrect syntax near '@SortOrder'. Invalid usage of the option NEXT in the FETCH statement [duplicate]“@SortOrder”附近的语法不正确。 FETCH 语句中选项 NEXT 的使用无效 [重复]
【发布时间】:2020-10-07 15:22:40
【问题描述】:

我使用的是 Dapper 2.0.35,MS SQL Server 14.0.1。运行以下代码时出现 SQL 异常:

string sortField = "Id";
switch (sortBy)
{
    case "city":
        sortField = "City";
        break;
    case "state":
        sortField = "State";
        break;
    case "county":
        sortField = "County";
        break;
    case "country":
        sortField = "Country";
        break;
    default:
        break;
}

// Get all customers based on the filter criteria
string sortOrder = sortDesc == true ? "DESC" : "ASC";
int offsetRows = pageSize * (pageNumber - 1);
var parameters = new
{
    SortField = sortField,
    SortOrder = sortOrder,
    OffsetRows = offsetRows,
    PageSize = pageSize,
};

// Execute!
var sql = "SELECT * FROM Customer ORDER BY @SortField @SortOrder OFFSET @OffsetRows ROWS FETCH NEXT @PageSize ROWS ONLY";
var result = (await connection.QueryAsync<Customer>(sql, parameters)).AsList();

在我看来,这是一个有效的 SQL 查询。 Exception 在@SortOrder 附近说语法不正确,但我在哪里做错了?我在 SQL 中测试了以下查询(类似于我的代码?),运行良好:

SELECT * FROM Customer ORDER BY County ASC OFFSET 0 ROWS FETCH NEXT 25 ROWS ONLY

我哪里做错了?

【问题讨论】:

  • 您不能参数化订购字段和订购方向。你真的写了ORDER BY value1 value2
  • @LasseV.Karlsen 给了我正确的答案。是的,这就是为什么。所以我应该这样写我的查询? $"SELECT yadayada {sortField} {sortOrder} yadayada"

标签: c# sql-server


【解决方案1】:

大多数 SQL 引擎不允许您参数化排序字段和方向,如 cmets 中所述。解决此问题的方法通常是在参数上使用 CASE 语句。

CASE @SortField
    When 'city' then City
    When 'state' then State
End

上面的内容应该适用于 SQL。 您可以查看这个较旧的 StackOverflow 问题以了解更多信息: "Order By" using a parameter for the column name

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 2020-01-14
    • 2019-03-08
    相关资源
    最近更新 更多