2010-10-20 19 views
6

Có cách nào để tìm ra các cột trong lược đồ của tôi có đầy đủ các giá trị null không? Có một số trường trong một vài bảng mà tôi biết không được ứng dụng sử dụng và sẽ bị loại bỏ, nhưng tôi muốn xem liệu có cách tự động/tập lệnh để tìm ra điều này trên toàn bộ cơ sở dữ liệu không/có thể loại bỏ.Làm cách nào để tìm tất cả các cột được điền bằng 100% null trong lược đồ cơ sở dữ liệu SQL Server của tôi?

Chạy SQL Server 2005 trên x86 nếu nó quan trọng.

Cảm ơn trước!

+0

Bạn đã xem chủ đề này: http://stackoverflow.com/questions/63291/sql-select-columns-with-null-values-only? Ok, bạn sẽ cần một con trỏ khác xung quanh cho mỗi bảng. –

Trả lời

7
create table #SuspectColumns (
    TABLE_SCHEMA sysname, 
    TABLE_NAME sysname, 
    COLUMN_NAME sysname 
) 

declare csrColumns cursor fast_forward for 
    select TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME 
     from INFORMATION_SCHEMA.COLUMNS 
     where IS_NULLABLE = 'YES' 

declare @TABLE_SCHEMA sysname, 
     @TABLE_NAME sysname, 
     @COLUMN_NAME sysname, 
     @sql nvarchar(max) 

open csrColumns 

while (1=1) begin 
    fetch next 
     from csrColumns 
     into @TABLE_SCHEMA, @TABLE_NAME, @COLUMN_NAME 

    if @@FETCH_STATUS<>0 break 

    set @sql = N'if not exists(select 1 from ' + QUOTENAME(@TABLE_SCHEMA) + N'.' + QUOTENAME(@TABLE_NAME) + N' where ' + QUOTENAME(@COLUMN_NAME) + N'is not null) 
        insert into #SuspectColumns values (''' + @TABLE_SCHEMA + N''',''' + @TABLE_NAME + N''',''' + @COLUMN_NAME + N''')' 

    exec sp_executesql @sql 
end /* while */ 

close csrColumns 
deallocate csrColumns 

select * from #SuspectColumns 

drop table #SuspectColumns 
+0

Thật tuyệt vời! Điều này làm việc hoàn hảo như được viết và hữu ích hơn nhiều so với tôi dự đoán như một công cụ phân tích về cách chúng tôi đang sử dụng lược đồ của chúng tôi (hoặc không sử dụng nó, như trường hợp này có thể). Đã chạy siêu nhanh trong 1.145 giây khi chạy đầu tiên, 0.08 giây trên lần chạy thứ hai trên 55 bảng với tổng số 616.000 hàng. –

0

bạn có thể trả tối đa (cột) và kiểm tra null

0

Off đỉnh đầu của tôi, tôi tin rằng các lệnh SQL sau đây nên làm việc. Nó sẽ thực hiện một truy vấn cho mỗi kết hợp bảng/cột và truy vấn sẽ trả về tên bảng và tên cột nếu kết hợp bảng/cột đó không có hàng hoặc tất cả các hàng rỗng.

DECLARE @table_columns TABLE 
(
    table_name nvarchar(128), 
    column_name nvarchar(128) 
); 
DECLARE @table_name nvarchar(128); 
DECLARE @column_name nvarchar(128); 

INSERT INTO @table_columns(table_name, column_name) 
select TABLE_NAME, COLUMN_NAME from INFORMATION_SCHEMA.columns; 

while (select count(*) from @table_columns) > 0 
begin 
    select top 1 @table_name = table_name, @column_name = column_name from @table_columns 
    exec('SELECT ''' + @table_name + ''' as table_name, ''' + @column_name + ''' as column_name WHERE NOT EXISTS (SELECT TOP 1 * FROM ' + @table_name + ' WHERE ' + @column_name + ' IS NOT NULL)') 
    delete from @table_columns where table_name = @table_name and column_name = @column_name 
end 
+0

Nếu bạn có bảng/cột có tên không chuẩn (ví dụ: 'fo] 'o') hoặc trong các lược đồ khác thì tập lệnh này sẽ không hoạt động. –

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