Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Sélectionner des colonnes non vides à l'aide de SQL Server

Je ne sais pas si c'est plus rapide, mais vous pouvez utiliser une astuce :FOR XML AUTO omettra les colonnes sans contenu :

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

Voici le résultat :col3 manque...

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

Sachant cela, vous pourriez trouver la liste des colonnes, qui ne sont pas NULL dans toutes les lignes, comme ceci :

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

Le contenu de @ColList est maintenant col1,col2 . Cette chaîne que vous pouvez placer dans un SELECT créé dynamiquement .

MISE À JOUR :Conseils

Il serait très astucieux de remplacer le SELECT * avec une liste de colonnes créée à partir de INFORMATION_SCHEMA.COLUMNS en excluant tous les éléments not-nullable . Et - si nécessaire et possible - des types contenant des données très volumineuses (BLOB).

MISE À JOUR 2 :Performances

Je ne sais pas ce que sont vos données très volumineuses signifie en fait ... Je viens d'essayer ceci sur une table avec environ 500 000 lignes (avec SELECT * ) et il est revenu correctement après moins d'une minute. J'espère que c'est assez rapide...