Below query will give you exact size of data stored in Table:
CREATE TABLE #Size
(
[TableName] VARCHAR(100)
,[TotalBytes] INT
)
SELECT
ROW_NUMBER() OVER(ORDER BY CONCAT(C.TABLE_SCHEMA,C.TABLE_NAME)) [RNo]
,CONCAT('SELECT ''[',C.TABLE_SCHEMA,'].[',C.TABLE_NAME,']'' [TableName], ',
STRING_AGG(CONCAT('ISNULL(SUM(DATALENGTH(',[COLUMN_NAME],')),0)'), ' + '), ' [TotalBytes] FROM [', C.TABLE_SCHEMA, '].[', C.TABLE_NAME,']') [Query]
INTO #Queries
FROM
Information_Schema.COLUMNS C
LEFT JOIN
Information_Schema.VIEW_TABLE_USAGE V
ON C.TABLE_NAME = v.VIEW_NAME
WHERE V.VIEW_NAME IS NULL
GROUP BY
C.TABLE_SCHEMA, C.TABLE_NAME
DECLARE @sqlcmd VARCHAR(MAX) = (SELECT STRING_AGG(Query,';' + CHAR(10)) FROM #Queries)
INSERT INTO #Size EXEC(@sqlcmd);
SELECT * FROM #Size
In MS SQL If you want to get exact size of data stored in all tables then you can get it like this:
CREATE TABLE #Size
(
[TableName] VARCHAR(100)
,[TotalBytes] INT
)
SELECT
ROW_NUMBER() OVER(ORDER BY CONCAT(C.TABLE_SCHEMA,C.TABLE_NAME)) [RNo]
,CONCAT('SELECT ''[',C.TABLE_SCHEMA,'].[',C.TABLE_NAME,']'' [TableName], ',
STRING_AGG(CONCAT('ISNULL(SUM(DATALENGTH(',[COLUMN_NAME],')),0)'), ' + '), ' [TotalBytes] FROM [', C.TABLE_SCHEMA, '].[', C.TABLE_NAME,']') [Query]
INTO #Queries
FROM
Information_Schema.COLUMNS C
LEFT JOIN
Information_Schema.VIEW_TABLE_USAGE V
ON C.TABLE_NAME = v.VIEW_NAME
WHERE V.VIEW_NAME IS NULL
GROUP BY
C.TABLE_SCHEMA, C.TABLE_NAME
DECLARE @sqlcmd VARCHAR(MAX) = (SELECT STRING_AGG(Query,';' + CHAR(10)) FROM #Queries)
INSERT INTO #Size EXEC(@sqlcmd);
SELECT * FROM #Size