2010-11-26 7 views
2

J'ai une table avec 8 colonnes et 5000+ lignes.nombre de colonnes qui ont des données pour chaque ligne

J'avais besoin d'aide pour écrire t-sql select qui compterait pour chaque ligne le nombre de colonnes qui ne sont pas nulles.

+0

Voulez-vous spécifiquement ** TSQL (Transact SQL) ** ou tout code MS SQL Server, que ce soit TSQL valide ou non? – DVK

Répondre

1

Essayez cela, remplacer les deux occurrences de "catalogue" avec le nom de votre table. Cela a été testé avec succès sur SQL Server 2008 R2 Dev Edition dans la base de données ReportServer par défaut.

DECLARE @Sql nvarchar(max) 
SET @Sql = 'SELECT 0' 

SELECT 
    @Sql = @Sql + ' 
+ CASE WHEN [' + [sys].[columns].[name] + '] IS NULL THEN 1 ELSE 0 END' 
FROM [sys].[columns] 
WHERE [sys].[columns].[object_id] = OBJECT_ID('Catalog') 
    AND [sys].[columns].is_nullable = 1 

SET @Sql = @Sql + ' 
AS [NullValuesCount] FROM [Catalog]' 

PRINT @Sql 

EXEC sp_executesql @Sql 

Notez que cette approche est susceptible d'une attaque par injection SQL si vous ne pouvez pas faire confiance à la source des noms de colonnes (par exemple si les utilisateurs finaux peuvent provoque de créer des colonnes avec des noms sous leur contrôle).

+0

Est-ce tsql valide (je quitte les tags de l'OP)? Je pensais que c'est MSSQLServer seulement? – DVK

+0

@DVK: Oui, je l'ai testé dans SQL Server 2008 Dev Edition en utilisant la base de données ReportServer par défaut –

+0

Cela fonctionne, a dû changer peu mais il a fait l'affaire –

2

SQL Transact pure (ne pas utiliser l'appel SQL dynamique qui ne fait pas partie de TSQL):

SELECT 
    CASE WHEN c1 IS NULL THEN 0 ELSE 1 END 
    + CASE WHEN c2 IS NULL THEN 0 ELSE 1 END 
    + CASE WHEN c3 IS NULL THEN 0 ELSE 1 END 
    + CASE WHEN c4 IS NULL THEN 0 ELSE 1 END 
    + CASE WHEN c5 IS NULL THEN 0 ELSE 1 END 
    + CASE WHEN c6 IS NULL THEN 0 ELSE 1 END 
    + CASE WHEN c7 IS NULL THEN 0 ELSE 1 END 
    + CASE WHEN c8 IS NULL THEN 0 ELSE 1 END 
FROM T 
+2

Il vous manque des 'WHEN's! –

+1

@Daniel - oui. Duh. Fixé. thx – DVK

Questions connexes