Reputation: 593
This code provide a possibility to sum a datalength in a single column:
select sum(datalength(column_1))
from my_table
This part provide me an information about columns in my_table
SELECT COLUMN_NAME,TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'my_table' AND TABLE_SCHEMA='my_schema'
and now i would like to add a column to second select result with sum of data length for each column, so i nedd a column like this:
sum(datalength(col_1))
sum(datalength(col_2))
.
.
.
sum(datalength(col_n))
Could you help me to prepare a proper select to achieve explained result?
EDIT: I need to count how many megabytes have elements in each column (in all rows):
1) if its int type column it is easy: (size of int * number of rows)
2) when column is a varchar i would like to add size of each varchar in this column
Upvotes: 0
Views: 1904
Reputation: 95574
Is this what you're after?
DECLARE @SQL nvarchar(MAX),
@CRLF nchar(2) = NCHAR(13) + NCHAR(10);
DECLARE @Schema sysname = N'dbo', --Replace with appropriate Schema
@Table sysname = N'PerformanceTest'; --Replace with appropriate Table
SET @SQL = N'SELECT ' +
STUFF((SELECT N' +' + @CRLF +
N' ISNULL(SUM(DATALENGTH(' + QUOTENAME(COLUMN_NAME) + N')),0)'
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE C.TABLE_SCHEMA = @Schema
AND C.TABLE_NAME = @Table
FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,11,N'') +N' AS DataLengthTotal' + @CRLF +
N'FROM ' + QUOTENAME(@Schema) + N'.' + QUOTENAME(@Table) + N';';
PRINT @SQL;
EXEC sp_executesql @SQL;
Seems the OP is not after a grant total, but total by column. This is can be easily be changed by changing the below
SELECT N' +' + @CRLF +
N' ISNULL(SUM(DATALENGTH(' + QUOTENAME(COLUMN_NAME) + N')),0)'
To the below:
SELECT N', ' + @CRLF +
N' ISNULL(SUM(DATALENGTH(' + QUOTENAME(COLUMN_NAME) + N')),0) AS ' + QUOTENAME(CONCAT(C.COLUMN_NAME,N'DataLength'))
And removing the alias after the STUFF
expression.
Upvotes: 1
Reputation: 29943
If I understand you correctly and you want to " ... add a column to second select result (SELECT ... FROM INFORMATION_SCHEMA.COLUMNS ...
) with sum of data length for each column ... ", a dynamic statement should be an option:
DECLARE @stm nvarchar(max) = N''
SELECT @stm = CONCAT(
@stm,
N'UNION ALL ',
N'SELECT ''',
COLUMN_NAME,
N''' AS [COLUMN_NAME], ''',
TABLE_SCHEMA,
N''' AS [TABLE_SCHEMA], ''',
TABLE_NAME,
N''' AS [TABLE_NAME], ',
CONVERT(nvarchar(max), ORDINAL_POSITION),
N' AS [ORDINAL_POSITION], ''',
DATA_TYPE,
N''' AS [DATA_TYPE], ',
N'(SELECT SUM(DATALENGTH(',
COLUMN_NAME,
N')) FROM ',
QUOTENAME(TABLE_SCHEMA),
N'.',
QUOTENAME(TABLE_NAME),
N') AS [DATA_LENGTH] '
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTable' AND TABLE_SCHEMA = 'YourSchema'
SELECT @stm = STUFF(@stm, 1, 10, N'')
PRINT @stm
EXEC sp_executesql @stm
Upvotes: 2