Очень базовое решение будет просто использовать группирование и агрегирование, например:
SELECT
xtype,
total_count = COUNT(*),
last_crdate = MAX(crdate),
last_refdate = MAX(refdate)
FROM sysobjects
GROUP BY xtype
Это, однако, возвращает информацию обо всех типах объектов в текущей базе данных, включая те, которые вы не упоминали вваш вопрос, например, ограничения, ключи и т. д.
Таким образом, вы можете сузить результирующий список, применив фильтр к xtype
, например:
SELECT
xtype,
total_count = COUNT(*),
last_crdate = MAX(crdate),
last_refdate = MAX(refdate)
FROM sysobjects
WHERE xtype IN ('U', 'V', 'FN', 'TF', 'IF', 'P')
GROUP BY xtype
Обратите внимание, что есть тритипы пользовательских функций в SQL Server.Они обозначены в sysobjects
следующим образом:
Соответственно, информация о функциях будет разбита на три строки, если вы воспользуетесь приведенным вышескрипт.Если вы хотите сгруппировать эти результаты в одну строку, ваш запрос должен быть немного более сложным.Например, вот так:
SELECT
type,
total_count = COUNT(*),
last_crdate = MAX(crdate),
last_refdate = MAX(refdate)
FROM (
SELECT
type = CASE
WHEN xtype = 'U' THEN 'table'
WHEN xtype = 'V' THEN 'view'
WHEN xtype = 'P' THEN 'proc'
WHEN xtype IN ('FN', 'TF', 'IF') THEN 'udf'
END,
crdate,
refdate
FROM sysobjects
WHERE xtype IN ('FN', 'TF', 'IF', 'P', 'U', 'V')
) s
GROUP BY type
Здесь исходные типы сначала заменяются пользовательскими типами на основе значения xtype
.Все строки, относящиеся к функциям, помечены просто как udf
, независимо от фактического типа функции, поэтому в конце вы можете просто сгруппировать по столбцу пользовательского типа и получить необходимые итоги, информация о функциях теперь собирается в одну строку.
Ссылка: