2009-08-07 2 views
2

Я разработал запроса в режиме SQL, используя MS Access:Использование математических функций в Sql с MS Access

select floor(num1) from t1; 

Когда я запускаю его, я получаю «неопределенная функция слово».

я получаю подобные ошибки для Ceil, Mod, Power, Sign, Sqrt, Trunc и initcap функций.

Является ли синтаксис SQL базы данных базы данных Access эквивалентными функциями?

ответ

12

Заменить пол() с помощью функции Int(). Я узнал об этом, выполнив поиск в файлах справки Access, в этом случае, нажав F1 в дизайнере запросов и выполнив поиск «функций». Это привело меня к теме справки, в которой сравнивались функции VBA и T-SQL.

Возможно, вам стоит взглянуть на Access database engine SQL Reference. Я не могу найти хорошую онлайн-ссылку для функций, поддерживаемых службами выражения Jet/ACE и Access. По какой-то неизвестной причине в Access Access не были включены выражения Jet/ACE, поскольку Jet 3.0 и этот старый ресурс были окончательно удалены из MSDN год или два назад :(

Имейте в виду, что служба выражения Jet/ACE для использования внешний доступ поддерживает гораздо меньший набор функций, который возможен с помощью службы выражения доступа при запуске SQL внутри Access 2007. В общем, функции VBA5 (в отличие от методов), которые включают простые типы данных (в отличие от, скажем, массивов или объекты) поддерживаются вне пользовательского интерфейса Access, а приблизительный список имен функций см. в разделе «Использование режима работы в песочнице с пакетом обновления 3 (SP3) и пакетом обновления 4.0» this MSDN article.

Также ссылка на функции в помощь VBE должна быть отправной точкой.

Файлы справки не идеальны, но небольшой поиск должен предоставить вам то, что вам нужно.

+1

Nice edit. Но я очень хочу, чтобы вы вложили такие предложения в комментарии, чтобы я мог сам их редактировать. –

+0

Другой вариант - создать ваши запросы как passthoughs. Затем вы можете использовать свои функции sql. Кроме того, если у вас несколько подключений на больших таблицах или может значительно уменьшить набор данных на конце sql, сквозные переходы могут значительно повысить вашу производительность. – Praesagus

+1

Я не вижу никаких указаний в исходном сообщении, что задействован сервер. Для множественных объединений я стараюсь создавать представления на сервере для их выполнения, а затем ссылаться на представление, а не пытаться поддерживать сквозные запросы. В общем, я бы не стал это делать, даже если бы не обнаружил, что Jet в первую очередь возится. Мне кажется, что Jet намного эффективнее, чем многие люди дают ему кредит. –

0

Как уже упоминалось, Floor недоступен при доступе, вы должны использовать 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 

Как и другие математические операции, описанные выше, вы можете создавать дополнительные функции для создания этого набора функциональных возможностей.

1
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 
+1

'Floor (CDbl (2))' triggers error # 5, * * Invalid procedure call or argument * " – HansUp

+0

CDbl (2) вы получаете целое число назад 2, а не double 2.0 в Access –

+0

' TypeName (CDbl (2)) 'возвращает« Double », а не« Integer ». Не путайте, если он отображается где-то без десятичных знаков; это все еще Двойной. – HansUp

Смежные вопросы