Liste des fonctions d'agrégat

Existe-t-il un moyen d'extraire la list des fonctions agrégées supscopes par un dbms en utilisant les métadonnées jdbc ou en exécutant une requête spécifique à dbms?

Sur SQL Server, vous pouvez interroger XML qui se trouve dans le directory d'installation:

DECLARE @xml XML SELECT @xml = xy FROM OPENROWSET( BULK 'C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\SqlToolsData\1033\SQLCommonObjects.xml', SINGLE_BLOB ) x(y) ;WITH XMLNAMESPACES( 'http://tempuri.org/SqlCommonObjects.xsd' AS ns ) SELECT Category.Name.value('ns:DisplayName[1]', 'VARCHAR(MAX)') [Category], [Function].Name.value('ns:Name[1]', 'VARCHAR(MAX)') [Function], [Function].Name.query('for $p in ns:Parameters/ns:Parameter return concat($p/ns:Name[1],",")').value('.', 'VARCHAR(MAX)') Parameters FROM @xml.nodes('//ns:Category[ns:DisplayName="Aggregate Functions"]') AS Category(Name) CROSS APPLY Category.Name.nodes('ns:Objects/ns:Function') [Function](Name) 

Où après la déclaration BULK vous devez donner votre dossier (différence est principalement Program Files "et" Program_Files (x86) "et la version du server SQL (100 est 2008 dans l'exemple)

Votre message comporte plusieurs balises de database et chacune possède des catalogues système et / ou un schéma d'informations qui vous permettent de connaître la list des procédures. La table / vue à interroger différera cependant d'un moteur DB à l'autre … (Par exemple, dans Postgres, vous joinz pg_proc et pg_agrgregate, car information_schema.routines ne vous dira pas quels sont les agrégats.)

Il est généralement prudent de supposer que les fonctions d'agrégat typiques ( sum() , count() , avg() …) existent dans toutes les implémentations de database.

La seule exception dont je suis au courant est Postgres, qui ne supporte pas any() / some() raison de l' ambiguïté de la syntaxe :

 SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...; 

Il n'y a rien de complètement étanche, puisqu'il ne fait pas partie des spécifications JDBC. Si vous ne connaissez pas le moteur de database que vous utilisez lors de l'exécution, le mieux est de soumettre une requête de test à la database et de vérifier si elle a échoué avant d'utiliser une fonction d'agrégat non prise en charge.