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.
Réponses
Trop de publicités?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
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
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!
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