UFN_TABLE_STATISTICS

Returns a list of tables and their statistics.

Return

Return Type
table

Definition

Copy


CREATE function UFN_TABLE_STATISTICS()
    returns @DATA table 
        (SCHEMANAME nvarchar(128), 
        TABLENAME nvarchar(128), 
    CATALOGID uniqueidentifier,
        [ROWCOUNT] int
        RESERVEDSPACE int
        DATASIZE int
        INDEXSIZE int
    UNUSEDSPACE int,
    ISAUDITTABLE bit,
  ISCUSTOMTABLE bit)
with execute as owner
as
    begin
    insert into @DATA (SCHEMANAME, TABLENAME, CATALOGID, [ROWCOUNT], RESERVEDSPACE, DATASIZE, INDEXSIZE, UNUSEDSPACE, ISAUDITTABLE, ISCUSTOMTABLE)

    SELECT
    a3.name AS [schemaname],
    a2.name AS [tablename],
  case when RIGHT(a2.name, 5) = 'AUDIT' then
    case when exists (select 1 from dbo.TABLECATALOG where TABLENAME + 'AUDIT' = a2.name) then 
      (select top 1 TABLECATALOG.ID from dbo.TABLECATALOG where TABLECATALOG.TABLENAME + 'AUDIT' = a2.name)
    else
      case when exists (select 1 from dbo.CODETABLECATALOG where DBTABLENAME + 'AUDIT' = a2.name) then
        (select top 1 CODETABLECATALOG.ID from dbo.CODETABLECATALOG where CODETABLECATALOG.DBTABLENAME + 'AUDIT' = a2.name)
      end
    end
  else
    (select top 1 TABLECATALOG.ID from dbo.TABLECATALOG where TABLECATALOG.TABLENAME = a2.name)
  end
  CATALOGID,
    a1.rows as row_count,
    (a1.reserved + ISNULL(a4.reserved,0))* 8 AS reserved, 
    a1.data * 8 AS data,
    (CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data THEN (a1.used + ISNULL(a4.used,0)) - a1.data ELSE 0 END) * 8 AS index_size,
    (CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) > a1.used THEN (a1.reserved + ISNULL(a4.reserved,0)) - a1.used ELSE 0 END) * 8 AS unused,
    case when RIGHT(a2.name, 5) = 'AUDIT' then  
    case when exists (select 1 from INFORMATION_SCHEMA.COLUMNS where COLUMNS.TABLE_NAME = a2.name and COLUMNS.COLUMN_NAME = 'AUDITID' and COLUMNS.TABLE_SCHEMA = 'dbo')
        and exists(select 1 from INFORMATION_SCHEMA.COLUMNS where COLUMNS.TABLE_NAME = a2.name and COLUMNS.COLUMN_NAME = 'AUDITRECORDID' and COLUMNS.TABLE_SCHEMA = 'dbo')
        and exists(select 1 from INFORMATION_SCHEMA.COLUMNS where COLUMNS.TABLE_NAME = a2.name and COLUMNS.COLUMN_NAME = 'AUDITKEY' and COLUMNS.TABLE_SCHEMA = 'dbo')
        and exists(select 1 from INFORMATION_SCHEMA.COLUMNS where COLUMNS.TABLE_NAME = a2.name and COLUMNS.COLUMN_NAME = 'AUDITCHANGEAGENTID' and COLUMNS.TABLE_SCHEMA = 'dbo')
        and exists(select 1 from INFORMATION_SCHEMA.COLUMNS where COLUMNS.TABLE_NAME = a2.name and COLUMNS.COLUMN_NAME = 'AUDITDATE' and COLUMNS.TABLE_SCHEMA = 'dbo')
        and exists(select 1 from INFORMATION_SCHEMA.COLUMNS where COLUMNS.TABLE_NAME = a2.name and COLUMNS.COLUMN_NAME = 'AUDITTYPECODE' and COLUMNS.TABLE_SCHEMA = 'dbo') then   
        1   
    else   
        0   
    end  
  else 
    0
  end ISAUDITTABLE,
  (case when coalesce((select coalesce(TABLESPECXML.value('declare namespace bbfa="bb_appfx_table";/bbfa:TableSpec[1]/@IsBuiltIn','bit'), 0) from dbo.TABLECATALOG where TABLECATALOG.TABLENAME = a2.name), 1) = 1 then 0 else 1 end) ISCUSTOMTABLE

FROM
    (SELECT 
        ps.object_id,
        SUM (
            CASE
                WHEN (ps.index_id < 2) THEN row_count
                ELSE 0
            END
            ) AS [rows],
        SUM (ps.reserved_page_count) AS reserved,
        SUM (
            CASE
                WHEN (ps.index_id < 2) THEN (ps.in_row_data_page_count + ps.lob_used_page_count + ps.row_overflow_used_page_count)
                ELSE (ps.lob_used_page_count + ps.row_overflow_used_page_count)
            END
            ) AS data,
        SUM (ps.used_page_count) AS used
    FROM sys.dm_db_partition_stats ps
    GROUP BY ps.object_id) AS a1
--if using fulltext catalog or primary XML indexes you need to add in the following data

LEFT OUTER JOIN 
    (SELECT 
        it.parent_id,
        SUM(ps.reserved_page_count) AS reserved,
        SUM(ps.used_page_count) AS used
     FROM sys.dm_db_partition_stats ps
     INNER JOIN sys.internal_tables it ON (it.object_id = ps.object_id)
     WHERE it.internal_type IN (202,204) --202 = xml_index_nodes, 204 = fulltext_catalog_map

     GROUP BY it.parent_id) AS a4 ON (a4.parent_id = a1.object_id)
INNER JOIN sys.all_objects a2  ON ( a1.object_id = a2.object_id
INNER JOIN sys.schemas a3 ON (a2.schema_id = a3.schema_id)
WHERE a2.type <> N'S' and a2.type <> N'IT'

return 
end