2012-10-22 75 views
5

Tôi đã chạy vào một DB có bảng quá rộng. (600+ cột) Thậm chí yêu cầu 100 hàng đầu không có tham số mất 4 giây. Tôi muốn làm mỏng những bảng này xuống một chút.Đếm số lượng null trong mỗi cột

Để tìm ra cột nào có thể dễ dàng di chuyển đến các bảng mới hoặc bị xóa hoàn toàn, tôi muốn biết có bao nhiêu null trong mỗi cột. Điều này sẽ cho tôi biết thông tin nào có thể ít quan trọng nhất.

Tôi làm cách nào để viết truy vấn có thể tìm thấy tất cả các cột và đếm số không trong các cột đó?

Chỉnh sửa DB là máy chủ SQL 2008. Tôi là thực sự hy vọng không nhập từng cột riêng lẻ. Có vẻ như sys.columns có thể giúp điều này?

Chỉnh sửa2 Các cột là tất cả các loại khác nhau.

+2

ví dụ bạn muốn tìm các cột có tất cả-null để bạn chỉ có thể thả chúng? đau đớn, nhưng 'chọn đếm (*) từ đôi khi somecolumn là null' một-tại-một-thời gian sẽ làm các trick. –

+0

Các cột có cùng kiểu dữ liệu không? –

+0

Chúng không cùng loại. Các dữ liệu là rất không phù hợp, nó dao động từ số giấy phép lái xe đến các lĩnh vực địa chỉ, các giá trị tiền mặt, để "hứa ​​hẹn thực hiện" bất cứ điều gì đó. – Drigan

Trả lời

6

Hãy thử điều này

declare @Table_Name nvarchar(max), @Columns nvarchar(max), @stmt nvarchar(max) 

declare table_cursor cursor local fast_forward for 
    select 
     s.name, 
     stuff(
      (
       select 
        ', count(case when ' + name + 
        ' is null then 1 else null end) as count_' + name 
       from sys.columns as c 
       where c.object_id = s.object_id 
       for xml path(''), type 
      ).value('data(.)', 'nvarchar(max)') 
     , 1, 2, '') 
    from sys.tables as s 

open table_cursor 
fetch table_cursor into @Table_Name, @Columns 

while @@FETCH_STATUS = 0 
begin 
    select @stmt = 'select ''' + @Table_Name + ''' as Table_Name, ' + @Columns + ' from ' + @Table_Name 

    exec sp_executesql 
     @stmt = @stmt 

    fetch table_cursor into @Table_Name, @Columns 
end 

close table_cursor 
deallocate table_cursor 
+0

Nó đưa tôi một thời gian để quấn đầu của tôi xung quanh những gì bạn đã làm ở đó, nhưng có vẻ tốt cho đến nay. :) – Drigan

+0

Bây giờ tôi đã hiểu nó, điều đó thật tuyệt vời! Cảm ơn bạn! – Drigan

2
select count(case when Column1 is null then 1 end) as Column1NullCount, 
    count(case when Column2 is null then 1 end) as Column2NullCount, 
    count(case when Column3 is null then 1 end) as Column3NullCount, 
    ... 
from MyTable 
+0

Tôi * thực sự * hy vọng sẽ không thể đánh vào 688 cột riêng lẻ. . . có lẽ sys.columns sẽ được sử dụng? – Drigan

+0

Tại sao bạn nhập chúng? Cần đơn giản để lấy tên cột (Ví dụ: 'select * từ MyTable trong đó 1 = 0'), tùy thuộc vào cơ sở dữ liệu của bạn. Sau đó, nó là một chút công việc soạn thảo văn bản để hoàn thành nó. Có lẽ nhanh hơn viết một truy vấn động để làm điều đó. – RedFilter

+0

Tôi đoán tôi hy vọng cho một chút sang trọng hơn vì có một số bảng có hơn 100 cột. Không phải là kết thúc của thế giới nếu tôi không có nó, nhưng nó * sẽ * mất nhiều thời gian hơn một chút. – Drigan

Các vấn đề liên quan