Параметр ограничения MS SQL не работает

Я создал запрос с добавлением нескольких операторов условий. Все они работают нормально, но когда я печатаю, чтобы иметь параметр ограничения, я получаю только ошибки.

Итак, я использую 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 не использует ограничение, но использует TOP в операторе select (простите меня, если это не единственный вариант использования, MS SQL все еще не используется).

Я получаю сообщение об ошибке:

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

Теперь я нашел следующее на GitHub Горма: https://github.com/jinzhu/gorm/issues/1205

У них есть обходной путь, но для меня это не сработает. Парень также опубликовал обновленную функцию, чтобы исправить проблему. Однако я не уверен, как мне обновить код в сторонней библиотеке. Также это было опубликовано в 2016 году, поэтому не уверен, что этот код уже был добавлен в базу кода Gorm.


person Coder99    schedule 22.03.2018    source источник


Ответы (3)


Вам нужен Order By, чтобы использовать OFFSET + FETCH в сгенерированном SQL, отправленном на SQL Server, который будет добавлен вашим ORM

... должны быть соблюдены следующие условия:

...

Предложение ORDER BY содержит столбец или комбинацию столбцов, которые гарантированно являются уникальными.

Как это делает ГОРМ, я не знаю

person gbn    schedule 22.03.2018
comment
Просто попробовал это с приказом Горма после лимитного варианта. Но по-прежнему появляется такая же ошибка - person Coder99; 22.03.2018
comment
До того, как я начал использовать Gorm, я работал с чистым SQL. Итак, я знаю, что он работает с Go + MS SQL, но просто не могу заставить его работать с Gorm :( - person Coder99; 22.03.2018
comment
Похоже на ошибку в структуре Gorm. Он должен знать, как правильно построить запрос. Одним из обходных путей может быть создание хранимой процедуры для выполнения запроса. - person user1443098; 22.03.2018

Я публикую это как ответ, я предлагаю это больше работать, и, пожалуйста, дайте мне знать, если это не рекомендуется по какой-либо причине.

Мое рабочее решение,

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

Спасибо

person Coder99    schedule 22.03.2018

У меня аналогичная проблема. Получил работу, добавив .Order следующим образом:

qb := db.Table("tableName").Order("columnName").Limit(2).Select("col1, col2")
person Olavi Vaino    schedule 14.05.2018
comment
В то время я уверен, что пробовал это, и это не сработало, должно быть, я тоже этим занимался, или, может быть, я делал Limit, затем Order, и это могло иметь эффект. Но спасибо за публикацию вашей души - person Coder99; 16.05.2018