【问题标题】:MS SQL Limit option not workingMS SQL 限制选项不起作用
【发布时间】:2018-08-31 22:07:47
【问题描述】:

我已经构建了一个查询,其中添加了一些条件语句。它们都可以正常工作,但是当我输入有限制选项时,我只会收到错误。

所以我将 go 1.10 与 Gorm 和 Gin 框架一起使用。这是我当前的工作代码,

qb := myDB.Table("table").Select("xx, xxx, xxx, xxx")

rows, err := qb.Rows()

if err != nil {
    fmt.Println(err)
}

defer myDB.Close()

return rows

这一切正常,但是当我在任何地方添加限制时,例如在餐桌之前或之后,我都试过了,但真的不觉得有什么不同吗?例如,

qb := myDB.Table("table").Limit(3).Select("xx, xxx, xxx, xxx")

现在我知道 MS SQL 不使用限制,而是在 select 语句中使用 TOP(如果这不是唯一的用例,请原谅我,仍然没有大量使用 MS SQL)。

我得到的错误是,

mssql: Invalid usage of the option NEXT in the FETCH statement.

现在我在 Gorm 的 GitHub 上找到了以下内容,https://github.com/jinzhu/gorm/issues/1205

他们有一个解决方法,但这对我不起作用。这家伙还发布了一个更新的功能来纠正这个问题。但是,我不确定如何更新第三方库中的代码。这也是 2016 年发布的,所以不确定该代码是否已经添加到 Gorm 代码库中。

【问题讨论】:

    标签: sql-server go go-gorm


    【解决方案1】:

    您需要一个Order By 在生成的 SQL 中使用 OFFSET + FETCH 发送到 SQL Server,这将由您的 ORM 添加

    ...必须满足以下条件:

    ...

    ORDER BY 子句包含一个列或列组合 保证是唯一的。

    GORM是怎么做到的,我不知道

    【讨论】:

    • 刚试过,在限价选项后使用Gorm的订单。但仍然遇到同样的错误
    • 在我使用 Gorm 之前,我使用纯 SQL 进行了这项工作。所以我知道它适用于 Go + MS SQL,但似乎无法让它适用于 Gorm :(
    • 听起来像是 Gorm 框架中的一个错误。它应该知道如何正确地构造查询。一种解决方法可能是创建一个存储过程来执行查询。
    【解决方案2】:

    我将此作为答案发布,我将其作为一个解决方法,如果出于任何原因不推荐,请告诉我。

    我的工作解决方案,

    qb := myDB.Table("table").Select("TOP(?) xx, xxx, xxx, xxx", 3)
    

    谢谢

    【讨论】:

      【解决方案3】:

      我面临着类似的问题。通过像这样添加 .Order 让它工作:

      qb := db.Table("tableName").Order("columnName").Limit(2).Select("col1, col2")
      

      【讨论】:

      • 当时,我确信我试过这个但它没有用,一定是我也在做的事情,或者我在做限价然后下单,这可能会产生连锁反应。但是感谢您发布您的灵魂
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-27
      • 2023-03-18
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      相关资源
      最近更新 更多