Использование математических функций в Sql с MS Access
-
12-09-2019 - |
Вопрос
Я разработал запрос в SQL View с использованием MS Access:
select floor(num1) from t1;
Когда я запускаю его, я получаю "undefined function floor".
Я получаю аналогичные ошибки для Ceil
, Mod
,Power
, Sign
, Sqrt
, Trunc
, и initcap
функции.
Имеет ли SQL-синтаксис Access database engine эквивалентные функции?
Решение
Замените Floor() на Int().Я узнал об этом, выполнив поиск в файлах справки Access, в данном случае нажав клавишу F1 в конструкторе запросов и выполнив поиск "функции". Это привело меня к разделу справки, в котором сравниваются функции VBA и T-SQL.
Вероятно, вам следует взглянуть на Доступ к SQL-ссылке database engine.Я не могу найти хороший онлайн-справочник по функциям, которые поддерживаются через Jet / ACE и Access expression services.По какой-то неизвестной причине справка Access не включала выражения Jet / ACE начиная с Jet 3.0, и этот устаревший ресурс был окончательно удален из MSDN год или два назад : (
Имейте в виду, что служба выражений Jet / ACE для использования вне Access поддерживает гораздо меньшее подмножество функций, которое возможно с помощью службы выражений Access при запуске вашего SQL внутри Access 2007.Вообще говоря, функции VBA5 (в отличие от методов), которые включают простые типы данных (в отличие, скажем, от массивов или объектов), поддерживаются за пределами пользовательского интерфейса Access;приблизительный список имен функций приведен в разделе "Использовать операции в режиме изолированной среды с пакетом обновления Jet 4.0 3 и более поздними версиями" эта статья MSDN.
Кроме того, ссылка на функции в справке VBE должна быть отправной точкой.
Файлы справки не идеальны, но небольшой поиск должен дать вам то, что вам нужно.
Другие советы
Public Function Floor(ByVal x As Double) As Double
'Be Because VBA does not have a Floor function.
'Works for positive numbers
'Turns 3.9 -> 3
'Note: Round(3.9) = 4
Dim s As String, dPos As Integer
s = CStr(x)
dPos = InStr(s, ".")
Floor = CLng(Left(s, dPos - 1))
End Function
Как уже упоминалось, Floor недоступен в access, вам следует использовать int() в качестве альтернативы.Если вы настаиваете на использовании Floor, вы всегда можете создать функцию модуля vba в вашем mdb-файле, аналогичную приведенной ниже, но это, вероятно, излишне.
Public Function floor(dblIn As Double, dec As Integer) As Double
decPosition = InStr(Str(dblIn), ".")
x = Left(dblIn, decPosition + dec - 1)
floor = x
End Function
Подобно другим математическим операциям, которые вы описали выше, вы можете создать дополнительные функции для создания этого набора функциональных возможностей.