简体   繁体   English

如何计算SQL Server中每列(在一个表中)的数据长度?

[英]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.

相关问题 SQL Server:无法以较少的列数据长度更新表 - SQL Server : Unable to update table with less data length of column 如何在SQL Server的单列上多次联接单个表 - How to join single table multiple time on single column in sql server 如何在 SQL Server 2008 中将每三行合并为一列? - How to combine each three rows into single column in SQL Server 2008? 如何在SQL Server中根据其中的数据长度对列进行排序 - How to sort a column based on length of data in it in SQL server 如何检查表SQL Server中不存在列数据 - how to check column data is not there in table sql server 如何从住院患者表中对重新入院病例进行子集以计算 SQL Server 17 中重新入院病例的总住院时间? - How to subset the readmitted cases from an inpatients’ table to calculate the total length of stay of the readmitted cases in SQL Server 17? 如何在插入SQL Server的主表之前验证每个列 - How to validate each column before inserting into main table in SQL Server 如何从不同的表中获取更新的列名,并将其数据与列名一起插入SQL Server的单个历史表中? - How can I get updated column names from different tables and insert their data with column name in a single history table in SQL Server? 如何基于另一个SQL Server表的单列中的更改添加一个SQL Server表的行和时间戳 - How to add a row and timestamp one SQL Server table based on a change in a single column of another SQL Server table 允许更新SQL Server表中的单列 - Permission to update single column in SQL Server table
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM