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...