2012-01-31 107 views

Respuesta

15
declare @T table 
(
    ID int, 
    Name varchar(10), 
    Age int, 
    City varchar(10), 
    Zip varchar(10) 
) 

insert into @T values 
(1, 'Alex', 32, 'Miami', NULL), 
(2, NULL, 24, NULL, NULL) 

;with xmlnamespaces('http://www.w3.org/2001/XMLSchema-instance' as ns) 
select ID, 
     (
      select * 
      from @T as T2 
      where T1.ID = T2.ID 
      for xml path('row'), elements xsinil, type 
     ).value('count(/row/*[@ns:nil = "true"])', 'int') as NullCount 
from @T as T1 

Resultado:

ID   NullCount 
----------- ----------- 
1   1 
2   3 

Actualización:

Aquí hay una versión mejor. Gracias a Martin Smith.

;with xmlnamespaces('http://www.w3.org/2001/XMLSchema-instance' as ns) 
select ID, 
     (
      select T1.* 
      for xml path('row'), elements xsinil, type 
     ).value('count(/row/*[@ns:nil = "true"])', 'int') as NullCount 
from @T as T1 

Actualización:

Y con un poco más rápido expresión XQuery.

;with xmlnamespaces('http://www.w3.org/2001/XMLSchema-instance' as ns) 
select ID, 
     (
      select T1.* 
      for xml path('row'), elements xsinil, type 
     ).value('count(//*/@ns:nil)', 'int') as NullCount 
from @T as T1 
+3

Wooooowww !!! +1 –

+0

= D> Estoy impresionado +1 –

+1

[Creo que puede mejorar la consulta secundaria aquí] (http://dba.stackexchange.com/a/14870/3690) –

0

Esto debería resolver su problema:

select count (id) 
where (isnull(Name,"") = "" or isnull(City,"") = "" or isnull(Zip,"") = "") 

No es una solución inteligente, pero debe hacer el trabajo.

+0

me preguntó sin especificar nombres de columna!?! – German

+0

Espero que la declaración 'Group By' - para extender mi muestra no sea el problema para usted, de ser así, entonces>: o –

3
SELECT id, 
    CASE WHEN Name IS NULL THEN 1 ELSE 0 END + 
    CASE WHEN City IS NULL THEN 1 ELSE 0 END + 
    CASE WHEN Zip IS NULL THEN 1 ELSE 0 END 
FROM YourTable 

Si no desea que los nombres de columna explícitos en consulta, la bienvenida a la consulta dinámica

DECLARE @sql NVARCHAR(MAX) = '' 
SELECT @sql = @sql + N' CASE WHEN '+QUOTENAME(c.name)+N' IS NULL THEN 1 ELSE 0 END +' 
FROM sys.tables t 
JOIN sys.columns c 
    ON t.object_id = c.object_id 
WHERE 
    c.is_nullable = 1 
AND t.object_id = OBJECT_ID('YourTableName') 

SET @sql = N'SELECT id, '[email protected] +N'+0 AS Cnt FROM [YourTableName]' 
EXEC(@sql) 
+0

¡Pregunté sin especificar los nombres de columna!?! – German

+0

Ver respuesta actualizada. –

+0

@Martin: No entendí la pregunta. –

0
DECLARE @tempSQL nvarchar(max) 
SET @tempSQL = N'SELECT ' 

SELECT @tempSQL = @tempSQL + 'sum(case when ' + cols.name + ' is null then 1 else 0 end) "Null Values for ' + cols.name + '", 
      sum(case when ' + cols.name + ' is null then 0 else 1 end) "Non-Null Values for ' + cols.name + '",' FROM sys.columns cols WHERE cols.object_id = object_id('TABLE1'); 

SET @tempSQL = SUBSTRING(@tempSQL, 1, LEN(@tempSQL) - 1) + ' FROM TABLE1;' 

EXEC sp_executesql @tempSQL 
Cuestiones relacionadas