Sélectionnez une colonne uniquement avec des valeurs

J'ai une table dans la database structurée comme ci-dessous.

col1 col2 col3 col4 col5 col6 frnkeyid1 frnkeyid2 ----------------------------------------------------------- a 2 3 2 4 b 1 4 2 5 c 12 5 2 6 

Dans le tableau ci-dessus, aucune donnée n'est insérée dans col4 , col5 et col6 . Maintenant, je veux écrire une procédure / requête qui supprime toutes les colonnes de la table de résultats où aucune valeur n'est input pour cette colonne.

Fe le résultat pour le tableau ci-dessus:

 col1 col2 col3 frnkeyid1 frnkeyid2 ----------------------------------------- a 2 3 2 4 b 1 4 2 5 c 12 5 2 6 

Comment puis-je faire ceci?

Tu peux essayer ça.

 -- For obtain used columns DECLARE @ColNames NVARCHAR(MAX) ='' SELECT @ColNames = @ColNames + ', ' + QUOTENAME(ColNames) FROM MyTable UNPIVOT( V FOR ColNames IN ([col1],[col2],[col3],[col4],[col5],[col6],[frnkeyid1],[frnkeyid2])) UNPVT GROUP BY QUOTENAME(ColNames) DECLARE @query NVARCHAR(MAX) = 'SELECT ' + STUFF(@ColNames,1,1,'') + ' FROM MyTable' EXEC (@query) 

Résultat:

 col1 col2 col3 frnkeyid1 frnkeyid2 ----------- ----------- ----------- ----------- ----------- 1 2 3 2 4 2 1 4 2 5 3 12 5 2 6 

Cette solution supprime littéralement toutes les colonnes de la table de résultats

Vous devez utiliser SQL dynamic. Laissez-moi montrer un exemple.

Je suppose, no data signifie NULL .

 CREATE TABLE dbo.test ( col1 char(1), col2 int, col3 int, col4 int, col5 int, col6 int, frnkeyid1 int, frnkeyid2 int ) INSERT INTO dbo.test VALUES ('a', 2, 3, NULL, NULL, NULL, 2, 4), ('b', 1, 4, NULL, NULL, NULL, 2, 5), ('c', 12, 5, NULL, NULL, NULL, 2, 6) 

C'est une déclaration de table de test. Pour créer une requête et l'exécuter, utilisez ce code:

 DECLARE @TableName sysname = N'test', @SQLQuery nvarchar(max) = N'' SELECT @SQLQuery = @SQLQuery + N' IF ( SELECT CASE WHEN COUNT(DISTINCT '+ QUOTENAME(c.[name]) +') = 0 AND MAX(' + QUOTENAME(c.[name]) +') IS NULL THEN 1 ELSE 0 END FROM ' + QUOTENAME(s.[Name]) + '.' + QUOTENAME(t.[Name]) + ') = 1 BEGIN ALTER TABLE ' + QUOTENAME(s.[Name]) + '.' + QUOTENAME(@TableName) + ' DROP COLUMN '+ QUOTENAME(c.[name]) +' PRINT ''Column name '+ QUOTENAME(c.[name]) + ' was droped from table ' + QUOTENAME(s.[Name]) + '.' + QUOTENAME(@TableName) + ''' END;' FROM sys.tables t INNER JOIN sys.columns c ON t.[object_id] = c.[object_id] INNER JOIN sys.schemas s On t.[schema_id] = s.[schema_id] WHERE t.[name] = @TableName PRINT @SQLQuery --EXEC (@SQLQuery) 

La déclaration PRINT vous donnera cette

 IF ( SELECT CASE WHEN COUNT(DISTINCT [col1]) = 0 AND MAX([col1]) IS NULL THEN 1 ELSE 0 END FROM [dbo].[test]) = 1 BEGIN ALTER TABLE [dbo].[test] DROP COLUMN [col1] PRINT 'Column name [col1] was droped from table [dbo].[test]' END; 

Pour chaque colonne.

Donc, s'il n'y a pas de valeurs, la colonne sera supprimée. Vous pouvez supprimer

 ALTER TABLE dbo.[test] DROP COLUMN [col1] 

Et exécuter le script pour voir, quelles colonnes seront supprimées de la table.

Si vous exécutez ce script sur la table de test, effectuez les opérations suivantes:

 SELECT * FROM dbo.test 

Cela vous amènera:

 col1 col2 col3 frnkeyid1 frnkeyid2 a 2 3 2 4 b 1 4 2 5 c 12 5 2 6