我遇到了表格過寬的數據庫。 (600列以上)甚至要求沒有參數的前100行需要4秒。我想稍微減少這些表格。計算每列中的空值數
要確定哪些列最容易移動到新表中或完全刪除,我想知道每列中有多少個空值。這應該告訴我哪些信息可能是最不重要的。
我該如何編寫一個查詢,可以查找所有列並計算這些列內的空值?
編輯的DB在SQL Server 2008。我真的希望不單獨鍵入每個列。它看起來像sys.columns可以幫助這個?
編輯2列是所有不同的類型。
我遇到了表格過寬的數據庫。 (600列以上)甚至要求沒有參數的前100行需要4秒。我想稍微減少這些表格。計算每列中的空值數
要確定哪些列最容易移動到新表中或完全刪除,我想知道每列中有多少個空值。這應該告訴我哪些信息可能是最不重要的。
我該如何編寫一個查詢,可以查找所有列並計算這些列內的空值?
編輯的DB在SQL Server 2008。我真的希望不單獨鍵入每個列。它看起來像sys.columns可以幫助這個?
編輯2列是所有不同的類型。
嘗試此
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
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
例如你想找到全是空的列,所以你可以放下它們?痛苦的,但'從某些列中選擇count(*),其中somecolumn是空的'一次只能做一次。 –
列是否都具有相同的數據類型? –
它們不是同一類型。數據是非常不匹配的,從駕駛執照號碼到地址字段,到現金價值,到「做出的承諾」,無論如何。 – Drigan