2009-08-07 6 views
2

J'ai conçu une requête dans SQL View en utilisant MS Access:Utilisation des fonctions mathématiques dans Sql avec MS Access

select floor(num1) from t1; 

Quand je lance, je reçois « rez-de-fonction non définie ».

J'obtiens des erreurs similaires pour Ceil, Mod, Power, Sign, Sqrt, Trunc et initcap fonctions.

La syntaxe SQL du moteur de base de données Access a-t-elle des fonctions équivalentes?

Répondre

12

Remplacer le plancher() par Int(). J'ai appris cela en cherchant dans les fichiers d'aide Access, dans ce cas, en tapant F1 dans le concepteur de requêtes, et en cherchant des "fonctions". Cela m'a amené à un sujet d'aide comparant les fonctions VBA et T-SQL.

Vous devriez probablement jeter un coup d'œil au Access database engine SQL Reference. Je ne trouve pas de bonne référence en ligne pour les fonctions prises en charge par les services d'expression Jet/ACE et Access. Pour une raison inconnue, l'aide d'Access n'a pas inclus d'expressions Jet/ACE depuis Jet 3.0 et cette ressource vieillie a finalement été supprimée de MSDN il y a un an ou deux :(

Gardez à l'esprit que le service d'expression Jet/ACE est utilisé outside Access prend en charge un sous-ensemble de fonctions beaucoup plus petit qui est possible en utilisant le service Expression Access lors de l'exécution de SQL dans Access 2007. De manière générale, les fonctions VBA5 (distinctes des méthodes) impliquent des types de données simples (distincts des tableaux par exemple). ou des objets) sont pris en charge en dehors de l'interface utilisateur Access, pour une liste approximative des noms de fonctions, voir la section «Utilisation du mode bac à sable avec Jet 4.0 Service Pack 3 et versions ultérieures» de this MSDN article

l'aide de VBE devrait être un point de départ.

Les fichiers d'aide ne sont pas parfaits, mais une petite recherche devrait vous apporter ce dont vous avez besoin.

+1

Belle édition. Mais je souhaite vraiment que vous mettiez ce genre de suggestions dans les commentaires afin que je puisse les éditer dans le poste moi-même. –

+0

Une autre option consiste à créer vos requêtes en tant que passthoughs. Ensuite, vous pouvez toujours utiliser vos fonctions sql. De même, si vous avez plusieurs jointures sur des tables volumineuses ou si vous pouvez réduire considérablement l'ensemble de données à l'extrémité sql, les passthrough peuvent augmenter considérablement vos performances. – Praesagus

+1

Je ne vois aucune indication dans le message d'origine indiquant que le serveur est impliqué. Pour les jointures multiples, j'ai tendance à créer des vues sur le serveur pour les faire, puis à créer un lien vers la vue, plutôt que d'essayer de gérer des requêtes passthrough. En général, je n'aurais pas pris la peine de le faire à moins que je ne trouve que Jet gâchait en premier lieu. Jet est beaucoup plus efficace que beaucoup de gens le croient, il me semble. –

0

Comme mentionné, Floor n'est pas disponible en accès, vous devriez utiliser int() comme alternative. Si vous insistez pour utiliser Floor, vous pouvez toujours créer une fonction vba module dans votre fichier mdb comme ci-dessous, mais c'est probablement trop. Comme pour les autres opérations mathématiques que vous avez décrites ci-dessus, vous pouvez créer des fonctions supplémentaires pour créer cet ensemble de fonctionnalités.

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))' déclenche l'erreur # 5, "* Appel ou argument de procédure invalide *" – HansUp

+0

CDbl (2) vous obtenez un nombre entier 2 et pas un double 2.0 dans Access –

+0

'TypeName (CDbl (2)) 'renvoie" Double ", pas" Entier ". Ne soyez pas confus s'il est affiché quelque part sans décimales; c'est toujours un double. – HansUp