2017-04-25 91 views
0

我有一個約40列的空值的函數,這些列在過去5年中從未使用過。所以我想寫一個確認這些字段有空值的查詢。我用下面選擇查詢:如何返回空值的函數列

select col1, col2, col3, .....coln 
from dbo.fn_functionName(DATEADD(YEAR, -5, DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)),'','','','') 

該查詢的問題在於,它的返回超過10 000條記錄和我的客戶都不滿意。檢查

+2

你想只顯示有40列空值的記錄客戶或您的期望是省略有空的行並輸出剩餘的行。 – Joby

+0

他們不滿意的事實是:行數太多,或者解決方案返回的數據太多這一事實?還是你的解決方案返回了它不應該的列?從你的問題中很難分辨出來,你可能應該詳細說明一下。 –

+0

嗨普羅霍羅夫,他們不滿意的事實,查詢返回太多的數據。我的期望是顯示具有空值的列。 – user7918666

回答

0

查詢,如果任何列包含空:

DECLARE @tb NVARCHAR(255), @sql NVARCHAR(MAX); 

SET @tb = N'dbo.[table]'; 

SET @sql = N'SELECT * FROM ' + @tb + ' WHERE 1 = 0'; 

SELECT @sql = @sql + N' OR ' + QUOTENAME(name) + ' IS NULL' 
    FROM sys.columns 
    WHERE [object_id] = OBJECT_ID(@tb); 

EXEC sp_executesql @sql; 

可能的幫助。您也可以只檢查是否重要的​​列是空的,並顯示唯一有效的:

select * 
from tabName 
where col1 is not null and col6 is not null... 

在最後您可以考慮創建第二個表1比1與舊值,如果它們是重要的。所有的表需要刷新不時:)
編輯:
我認爲這是類似於你正在尋找查詢:

Select [TransactionID] , [ProductID] ,[ReferenceOrderID] ,[ReferenceOrderLineID], [TransactionDate] ,[TransactionType] ,[Quantity],[ActualCost] ,[ModifiedDate] 
    from tableName 
    where datediff(year,[TransactionDate], GETDATE()) < 5 
      and ([ProductID] is not null and [ProductID] != '') 
      and ([TransactionType] is not null and [TransactionType] != '') 
      and ([Quantity] is not null) 
      and [ActualCost] is not null 

好了,是什麼在此查詢回事?選擇後,列出要顯示的列。如果你需要全部輸入「select *」。然後你選擇表格(通過選擇),這裏就是魔法。
datediff(year,date1,date2)計算兩個日期之間的差異。要檢查今天的日期,只需輸入GETDATE()。比其他條件。不像普通的編程語言,你不能輸入「something!= null」,你需要使用「something not not null」。有時你必須檢查它是空字符串還是空字符串。所以

([ProductID] is not null and [ProductID] != '') 

我希望幫助:)

+0

嗨Arkadiusz,我試過這種方法,但它不適合我。我用函數名稱替換了表名,並且它不起作用。我對SQL很新,你能幫助我嗎? – user7918666

+0

yapp :)你的目標是什麼?你能否列出你想要顯示的列(如果不是全部)並列出你想要有一些價值的列?和表名。我會爲你寫信:) –

+0

如果你練習很多,SQL就會變得簡單,所以不要在乎負面的評論。所有你需要的是實踐,所以我是在世界:) –

0

這正是我需要使用:

Select [TransactionID] , [ProductID] ,[ReferenceOrderID] ,[ReferenceOrderLineID], [TransactionDate] ,[TransactionType] ,[Quantity],[ActualCost] ,[ModifiedDate] 
    from tableName 
    where datediff(year,[TransactionDate], GETDATE()) < 5 
      and ([ProductID] is not null and [ProductID] != '') 
      and ([TransactionType] is not null and [TransactionType] != '') 
      and ([Quantity] is not null) 
      and [ActualCost] is not null