Список агрегатных функций - PullRequest
5 голосов
/ 31 мая 2011

Есть ли способ получить список агрегатных функций, поддерживаемых dbms, используя метаданные jdbc или выполнив какой-либо специальный запрос dbms?

Ответы [ 3 ]

1 голос
/ 31 мая 2011

На SQL Server вы можете запрашивать XML, который находится в установочном каталоге:

DECLARE @xml XML
SELECT @xml = x.y
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)

Где после инструкции BULK вы должны указать свою папку (в основном это «Program Files», «Program_Files (x86)» и SQLверсия сервера (например, 100 - 2008)

0 голосов
/ 31 мая 2011

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

0 голосов
/ 31 мая 2011

Ваше сообщение содержит несколько тегов БД, и у каждого есть системные каталоги и / или информационная схема, которая позволит вам узнать список процедур.Однако какая таблица / представление для запроса будет отличаться от механизма БД к следующему ... (Например, в Postgres вы присоединитесь к pg_proc и pg_aggregate, так как information_schema.routines не скажет вам, какие процессы являются агрегатами.)

Обычно можно предположить, что типичные агрегатные функции (sum(), count(), avg() ...) существуют во всех реализациях базы данных.

Единственное исключение, которое мне известноof is Postgres, который не поддерживает any() / some() из-за неоднозначности в синтаксисе :

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