2017-04-25 89 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