57 votes

SQL: sélectionnez les colonnes avec des valeurs NULL uniquement

Comment sélectionner toutes les colonnes d'une table qui ne contiennent que des valeurs NULL pour toutes les lignes? J'utilise MS SQL Server 2005 . J'essaie de savoir quelles colonnes ne sont pas utilisées dans le tableau afin de pouvoir les supprimer.

78voto

Charles Graham Points 8132

Voici la version SQL 2005 ou ultérieure: remplacez ADDR_Address par votre nom de table.

 declare @col varchar(255), @cmd varchar(max)

DECLARE getinfo cursor for
SELECT c.name FROM sys.tables t JOIN sys.columns c ON t.Object_ID = c.Object_ID
WHERE t.Name = 'ADDR_Address'

OPEN getinfo

FETCH NEXT FROM getinfo into @col

WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @cmd = 'IF NOT EXISTS (SELECT top 1 * FROM ADDR_Address WHERE [' + @col + '] IS NOT NULL) BEGIN print ''' + @col + ''' end'
    EXEC(@cmd)

    FETCH NEXT FROM getinfo into @col
END

CLOSE getinfo
DEALLOCATE getinfo
 

8voto

MobyDX Points 365

Cela devrait vous donner une liste de toutes les colonnes de la table "Personne" qui n'a que des valeurs NULL. Vous obtiendrez les résultats sous la forme de plusieurs ensembles de résultats, qui sont soit vides soit contiennent le nom d'une seule colonne. Vous devez remplacer "Personne" à deux endroits pour l'utiliser avec une autre table.

 DECLARE crs CURSOR LOCAL FAST_FORWARD FOR SELECT name FROM syscolumns WHERE id=OBJECT_ID('Person')
OPEN crs
DECLARE @name sysname
FETCH NEXT FROM crs INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC('SELECT ''' + @name + ''' WHERE NOT EXISTS (SELECT * FROM Person WHERE ' + @name + ' IS NOT NULL)')
    FETCH NEXT FROM crs INTO @name
END
CLOSE crs
DEALLOCATE crs
 

4voto

Kevin Fairchild Points 5991

Ou vouliez-vous simplement voir si une colonne n'a que des valeurs NULL (et, par conséquent, n'est probablement pas utilisée)?

Une clarification supplémentaire de la question pourrait être utile.

EDIT: Ok .. voici un code très approximatif pour vous aider à démarrer ...

 SET NOCOUNT ON
DECLARE @TableName Varchar(100)
SET @TableName='YourTableName'
CREATE TABLE #NullColumns (ColumnName Varchar(100), OnlyNulls BIT)
INSERT INTO #NullColumns (ColumnName, OnlyNulls) SELECT c.name, 0 FROM syscolumns c INNER JOIN sysobjects o ON c.id = o.id AND o.name = @TableName AND o.xtype = 'U'
DECLARE @DynamicSQL AS Nvarchar(2000)
DECLARE @ColumnName Varchar(100)
DECLARE @RC INT
    SELECT TOP 1 @ColumnName = ColumnName FROM #NullColumns WHERE OnlyNulls=0
    WHILE @@ROWCOUNT > 0
    BEGIN
        SET @RC=0
        SET @DynamicSQL = 'SELECT TOP 1 1 As HasNonNulls FROM ' + @TableName + ' (nolock) WHERE ''' + @ColumnName + ''' IS NOT NULL'
        EXEC sp_executesql @DynamicSQL
        set @RC=@@rowcount
        IF @RC=1
        BEGIN
            SET @DynamicSQL = 'UPDATE #NullColumns SET OnlyNulls=1 WHERE ColumnName=''' + @ColumnName + ''''
            EXEC sp_executesql @DynamicSQL
        END
        ELSE
        BEGIN
            SET @DynamicSQL = 'DELETE FROM #NullColumns WHERE ColumnName=''' + @ColumnName+ ''''
            EXEC sp_executesql @DynamicSQL
        END
    SELECT TOP 1 @ColumnName = ColumnName FROM #NullColumns WHERE OnlyNulls=0
    END

SELECT * FROM #NullColumns

DROP TABLE #NullColumns
SET NOCOUNT OFF
 

Oui, il existe des moyens plus simples, mais j'ai une réunion à laquelle je dois me rendre en ce moment. Bonne chance!

2voto

kristof Points 18322

Tu peux faire:

 select 
  count(<columnName>)
from
  <tableName>
 

Si le nombre renvoie 0, cela signifie que toutes les lignes de cette colonne sont toutes NULL (ou qu'il n'y a aucune ligne du tout dans le tableau)

peut être changé en

 select 
    case(count(<columnName>)) when 0 then 'Nulls Only' else 'Some Values' end
from 
    <tableName>
 

Si vous souhaitez l'automatiser, vous pouvez utiliser des tables système pour itérer les noms de colonnes dans la table qui vous intéresse

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X