T-SQL pour renvoyer la list délimitée des colonnes avec des valeurs NULL

Pour chaque ligne dans une vue, j'ai besoin de renvoyer la colonne ID pour cette ligne et une list délimitée de toutes les colonnes de cette ligne qui contiennent NULL.

Alors:

ID | Test1 | Test2 | Test3 5 'a' 'b' NULL 6 'a' 'b' 'c' 7 NULL 'b' NULL 

returnnerais:

 ID | InvalidColumns 5 Test3 7 Test1,Test3 

J'ai vu des solutions sur SO qui peuvent vous dire si des colonnes ont la valeur NULL, ou si une colonne pour toutes les lignes d'une table ont des valeurs NULL, mais rien qui listrait les colonnes par ligne.

Merci!

–MODIFIER–

Outre la colonne ID, les colonnes de la table ne sont pas connues. J'ai besoin d'une solution qui fonctionne avec n'importe quelle table / vue avec une colonne d'identification.

Vous pouvez utiliser la requête comme ceci ( STUFF est nécessaire pour supprimer la virgule principale):

 SELECT ID, STUFF( CONCAT(CASE WHEN Test1 IS NULL THEN ',Test1' END, CASE WHEN Test2 IS NULL THEN ',Test2' END, CASE WHEN Test3 IS NULL THEN ',Test3' END ), 1, 1, '') as InvalidColumns FROM table1 WHERE Test1 IS NULL OR Test2 IS NULL OR Test3 IS NULL; 

Si vous souhaitez rendre la requête dynamic, utilisez la requête suivante:

 DECLARE @table AS NVARCHAR(MAX), @cols1 AS NVARCHAR(MAX), @cols2 AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) SET @table = 'Table1' SET @cols1 = STUFF((SELECT distinct ',CASE WHEN ' + QUOTENAME(c.COLUMN_NAME) + ' IS NULL THEN '',' + c.COLUMN_NAME + ''' END' FROM INFORMATION_SCHEMA.columns c WHERE TABLE_SCHEMA = 'dbo' and TABLE_NAME = @table And COLUMN_NAME <> 'Id' FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') SET @cols2 = STUFF((SELECT distinct 'OR ' + QUOTENAME(c.COLUMN_NAME) + ' IS NULL ' FROM INFORMATION_SCHEMA.columns c WHERE TABLE_SCHEMA = 'dbo' and TABLE_NAME = @table And COLUMN_NAME <> 'Id' FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,3,'') SET @query = N'SELECT ID, STUFF(CONCAT(' + @cols1 + '), 1, 1, '''') as InvalidColumns FROM ' + @table + ' WHERE ' + @cols2 --SELECT @cols1, @cols2, @query EXEC sp_executesql @query 

Il produit le résultat suivant:

 | ID | INVALIDCOLUMNS | |----|----------------| | 5 | Test3 | | 7 | Test1,Test3 | 

SQL Fiddle

Cette requête peut aider si les colonnes sont corrigées.

 SELECT ID, CONCAT(case when Test1 is null then 'Test1' end, case when Test1 is null and (test2 is null or test3 is null) then ',' end, case when Test2 is null then 'Test2' end, case when (Test1 is null or test2 is null ) and test3 is null then ',' end, case when Test3 is null then 'Test3' end ) as InvalidColumns FROM table1 WHERE Test1 IS NULL OR Test2 IS NULL OR Test3 IS NULL