sql >> Databáze >  >> RDS >> Sqlserver

Vyberte neprázdné sloupce pomocí SQL Server

Nevím, jestli je to rychlejší, ale můžete použít jeden trik:FOR XML AUTO vynechá sloupce bez obsahu:

DECLARE @tbl TABLE(col1 INT,col2 INT,col3 INT);
INSERT INTO @tbl VALUES (1,2,NULL),(1,NULL,NULL),(NULL,NULL,NULL);

SELECT * 
FROM @tbl AS tbl
FOR XML AUTO

Toto je výsledek:col3 chybí...

<tbl col1="1" col2="2" />
<tbl col1="1" />
<tbl />

Když to víte, můžete najít seznam sloupců, které nejsou ve všech řádcích NULL, takto:

DECLARE @ColList VARCHAR(MAX)=
STUFF
(
    (
    SELECT DISTINCT ',' + Attr.value('local-name(.)','nvarchar(max)')
    FROM
    (
        SELECT
        (
            SELECT *
            FROM @tbl AS tbl
            FOR XML AUTO,TYPE
        ) AS TheXML
    ) AS t
    CROSS APPLY t.TheXML.nodes('/tbl/@*') AS A(Attr) 
    FOR XML PATH('')
    ),1,1,''
);

SELECT @ColList

Obsah @ColList je nyní col1,col2 . Tento řetězec můžete umístit do dynamicky vytvořeného SELECT .

AKTUALIZACE:Tipy

Bylo by velmi chytré nahradit SELECT * se seznamem sloupců vytvořeným z INFORMATION_SCHEMA.COLUMNS kromě všech bez možnosti null . A – pokud je to potřeba a možné – typy, které obsahují velmi velká data (BLOB).

AKTUALIZACE 2:Výkon

Nevím, jaká jsou vaše velmi velká data znamená ve skutečnosti... Zkoušel jsem to na tabulce s asi 500 000 řádky (pomocí SELECT * ) a správně se vrátil po méně než jedné minutě. Doufám, že je to dost rychlé...



  1. c3p0 říká - java.lang.Výjimka:DEBUG ONLY:Trasování zásobníku zpožděného odhlášení zdrojů při zahájení transakce hibernace

  2. Aktualizace PHP.ini na hostovaném webu GoDaddy

  3. Řádek shody Mysql EAV jako hodnota vlastnosti pole nebo entity

  4. MySQL extrahovat prostý text z html dat nebo PHP?