选择所有非空的行

时间:2016-12-10 16:24:51

标签: sql sql-server tsql

我想要一个只从表中选择行的函数,它不是空的。我的第一次尝试:

declare @col varchar(255), @cmd varchar(max);
DECLARE @Select VARCHAR(3000)
DECLARE @Werteneu VARCHAR(3000)
DECLARE @Tablename  VARCHAR(3000)

SELECT @Tablename = 'AD'
DECLARE getinfo cursor for

SELECT c.name FROM sys.tables t JOIN sys.columns c ON t.Object_ID = c.Object_ID
WHERE t.Name = @Tablename
SELECT @Werteneu = @Tablename
OPEN getinfo
FETCH NEXT FROM getinfo into @col
WHILE @@FETCH_STATUS = 0
BEGIN
    IF EXISTS (SELECT TOP 1 * FROM AD WHERE ' + @col + ' IS NOT NULL) BEGIN
    END
    FETCH NEXT FROM getinfo into @col
END
CLOSE getinfo
DEALLOCATE getinfo
exec ('select ' + @Werteneu + ' from AD')

请用您的测试表替换'AD'。我的问题是IF EXISTS (SELECT TOP 1 * FROM AD WHERE ' + @col + ' IS NOT NULL) BEGIN开始,尽管行是空的。

1 个答案:

答案 0 :(得分:2)

EXCEPT命令可用于删除符合特定条件的所有行。 在某些环境中,SORT操作可能很昂贵(可以通过良好的索引来纠正)

SELECT
    ColA
    ,ColB
    ,ColC
    ,ColD
    ,ColE
    ,ColF
    ,ColG
FROM
    mytable
EXCEPT
SELECT 
    NULL
    ,NULL
    ,NULL
    ,NULL
    ,NULL
    ,NULL
    ,NULL

这是动态构建查询的代码。

DECLARE @tablename VARCHAR(255) = 'Employee'
DECLARE @schemaname  VARCHAR(255) = 'HumanResources'
DECLARE @qrystr NVARCHAR(2000) = ''

;with cte
    AS
    (
    SELECT
        c.column_id
        ,c.name
    FROM
        sys.objects o 
            INNER JOIN sys.columns c 
                ON
                o.object_id = c.object_id
    WHERE
        o.name = @tablename
        AND
        SCHEMA_NAME(o.schema_id) = @schemaname
    )
SELECT
    @qrystr = 
    'SELECT ' 
    + STUFF((SELECT ',' + name FROM cte ORDER BY column_id FOR XML PATH ('')), 1, 1, '') 
    + ' FROM ' 
    + @schemaname + '.' + @tablename
    + ' EXCEPT '
    + ' SELECT '
    + STUFF((SELECT ',' + 'NULL' FROM cte FOR XML PATH ('')), 1, 1, '')