如何检查数据库中的哪些列动态保存数据

时间:2016-06-09 13:57:04

标签: sql-server

我正在处理一个问题,我需要像这样进行SQL查询:

SELECT 
    SUM(CASE WHEN ID IS NOT NULL THEN 0 ELSE 1 END) AS column_ID_count,
    SUM(CASE WHEN NAME IS NOT NULL THEN 0 ELSE 1 END) AS column_NAME_count,
    SUM(CASE WHEN COMMENT IS NOT NULL THEN 1 ELSE 0 END) AS column_COMMENT_count
FROM  
    Table1

问题是我有超过100列,因此手动进行此查询将是一个真正的痛苦。所以我认为应该有一种方法来选择所有列名并将它们转储到文本文件中。输出看起来像:

 SUM(CASE WHEN NAME IS NOT NULL THEN 0 ELSE 1 END) AS column_NAME_count,
 ...
 SUM(CASE WHEN COMMENT IS NOT NULL THEN 1 ELSE 0 END) AS column_COMMENT_count

我尝试了exec sp_help但这不是我需要的。那么有没有办法用查询来做到这一点?

3 个答案:

答案 0 :(得分:0)

如果你想要表格中所有列名的列表,那么你想要这样的东西;

DECLARE @TableName varchar(50); SET @TableName = 'TableName'

SELECT c.name
INTO #ColumnNames
FROM sys.columns c
JOIN sys.objects o
ON c.object_id = o.object_id
WHERE o.name = @TableName


SELECT * FROM #ColumnNames

将结果删除到文本文件中,如果这是你想要的并且你已经完成了。

如果您希望脚本返回数据库中的所有列以及它们是否包含数据,您可以使用它;

SELECT  'SELECT count([' + c.name + ']) as Data_Count, ''' + o.name + '.' + c.name + ''' AS Table_Column FROM [' + o.name + '] UNION ALL '
FROM    sys.columns c
JOIN sys.objects o
ON c.object_id = o.object_id
WHERE c.is_nullable = 1
AND o.type = 'U'

将结果粘贴到新窗口中。你将不得不删除最终的UNION ALL,这对text或ntext数据类型不起作用,所以如果你有其中的一些,你将不得不删除它们。你可以在查询中过滤掉它们,但是你永远不会知道它们。

编辑:如果要排除不兼容的数据类型,请使用此查询;

SELECT  'SELECT count([' + c.name + ']) as Data_Count, ''' + o.name + '.' + c.name + ''' AS Table_Column FROM [' + o.name + '] UNION ALL '
FROM sys.columns c
JOIN sys.objects o
    ON c.object_id = o.object_id
JOIN sys.types t
    ON c.user_type_id = t.user_type_id
WHERE c.is_nullable = 1
    AND o.type = 'U'
    AND t.name NOT IN ('image','text','ntext')

请记住使用不同的查询检查这些数据类型,这样您就不会错过它们。

答案 1 :(得分:0)

这将为您提供相关表格的列名称。

SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourtablename'

答案 2 :(得分:0)

尝试此查询

 declare @cnmae nvarchar(max)='select '
       SELECT @cnmae+= 'sum( case when ' + COLUMN_NAME +
    ' is not null then 0 else 1 end) as column_'+COLUMN_NAME+'_count,'
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = 'Table1'

        select @cnmae=stuff(@cnmae,len(@cnmae),1,'') + ' from Table1'

        exec sp_executesql @cnmae