[英]How to calculate data length in each column (in a single table) in SQL Server?
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 这部分向我提供了有关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) 1)如果它的int类型列很容易:(int的大小*行数)
2) when column is a varchar i would like to add size of each varchar in this column 2)当column是varchar时,我想在此列中增加每个varchar的大小
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: 如果我理解正确,并且您想“ ...在第二个选择结果中添加一列(
SELECT ... FROM INFORMATION_SCHEMA.COLUMNS ...
),并为每列提供数据长度的总和...” ,则应使用动态语句可以选择:
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
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. 似乎OP 不是在总计之后,而是按列总计。 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. 并在
STUFF
表达式后删除别名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.