2012-01-31 66 views

Trả lời

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 

Kết quả:

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

Cập nhật:

Đây là phiên bản tốt hơn. Cảm ơn 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 

Cập nhật:

Và với một chút nhanh hơn biểu thức 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> Tôi rất ấn tượng +1 –

+1

[Tôi nghĩ bạn có thể cải thiện truy vấn phụ tại đây] (http://dba.stackexchange.com/a/14870/3690) –

0

này nên giải quyết vấn đề của bạn:

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

Không phải là một giải pháp thông minh, nhưng nó phải làm việc.

+0

Tôi đã hỏi mà không chỉ định tên cột!?! – German

+0

Tôi hy vọng 'Nhóm By' - tuyên bố để mở rộng mẫu của tôi không phải là vấn đề cho bạn, nếu vậy thì>: 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 

Nếu bạn không muốn tên cột rõ ràng trong truy vấn, chào mừng bạn đến động truy vấn

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

Tôi hỏi mà không chỉ định tên cột!?! – German

+0

Xem câu trả lời được cập nhật. –

+0

@Martin: Tôi đã hiểu nhầm câu hỏi. –

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 
Các vấn đề liên quan