Как подсчитать количество объектов в SQL Server 2000 и получить дату его изменения? - PullRequest
2 голосов
/ 09 сентября 2011

Мне нужно подсчитать количество объектов в SQL Server 2000 при восстановлении из базы данных, чтобы убедиться, что восстановление включает в себя последние обновления. Я также хотел получить самую последнюю дату, когда объект был создан или изменен.

Специально хотел получить количество для количества таблиц, количество просмотров, количество udfs, количество sprocs и дату, когда он был создан или изменен.

select 
    count(xtype) as [MyCounts], 
    crdate as [CreateDate], 
    refdate as [ModifiedDate] 
from sysobjects 
where xtype like 'U%'  
--does not appear to be working correctly.

Ответы [ 2 ]

2 голосов
/ 09 сентября 2011

Очень базовое решение будет просто использовать группирование и агрегирование, например:

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 следующим образом:

  • FN - скалярная функция

  • TF - табличное значение с несколькими утверждениямиfunction

  • IF - встроенная табличная функция

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

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, независимо от фактического типа функции, поэтому в конце вы можете просто сгруппировать по столбцу пользовательского типа и получить необходимые итоги, информация о функциях теперь собирается в одну строку.

Ссылка:

1 голос
/ 09 сентября 2011

Вам следует публиковать ошибки, которые вы получаете, чтобы их было легче диагностировать. Однако, глядя на ваш запрос, скорее всего, вам не хватает GROUP BY для сопровождения агрегации COUNT, которую вы пытаетесь выполнить.

Теперь реальный вопрос в том, как отобразить агрегацию COUNT вместе со специфической для строки информацией, такой как дата создания?

Если есть 5 видов и 4 процесса, как выглядит каждая строка? Каковы заголовки столбцов? COUNT отображается в каждой строке вместе с деталями для этого элемента, как это?

select 
    c.cnt as [MyCounts], 
    s.name as [Name],
    s.xtype as [Type],
    s.crdate as [CreateDate], 
    s.refdate as [ModifiedDate] 
from 
    sysobjects s
    inner join (select COUNT(1) cnt, xtype from sysobjects group by xtype) c
        on  s.xtype = c.xtype
where 
    s.xtype like 'U%'
...