2014-07-25 67 views
1

最近,大约2个月前,需要检查表中具有NULL值的任何字段。检查表中是否有任何字段有空值

我现在进入另一个任务,但这次我需要检查表中的任何字段是否有空字符串值。

开始查询:

;With xmlnamespaces('http://www.w3.org/2001/XMLSchema-instance' as ns) 
SELECT * 
FROM [Schema].[Table] act 
where (
    select act.* 
    for xml path('row'), elements xsinil, type 
).exist('//*/@ns:nil') = 1 

我知道自己需要改变@ns:nil但正如我在T-SQL的XQuery实现是没有受过教育,我需要有人来帮助我这个初始查询。另外,我应该去MSDN以外的地方阅读使用和功能。

更新#1:

;With xmlnamespaces('http://www.w3.org/2001/XMLSchema-instance' as ns) 
Select * 
from Schema.Table act 
where (
    select act.* 
    for xml path('row'), elements xsinil, type 
).value('(//row/*)[1]', 'varchar(max)') = '' 

试过,但明显的领域之一包含字符0x001C等都需要转换为二进制,varbinary或图像,然后使用BINARY BASE64指令。

回答

1

构建XML并检查是否为空的节点值。比检查null更简单,并且如注释中所述,只有(n)varchar产生一个空字符串作为节点值。

select * 
from T 
where (
     select T.* 
     for xml path(''), type 
    ).exist('*/text()[. = ""]') = 1 
+0

我需要搜索的列是VarChar字段。事实上XQuery会更快,因为有些表只有7个字段,而其他的字段有50多个字段。因此,我需要“相对”轻松地遍历各个表,然后找出哪些表中有空值,因此我知道将哪些转换为NULL。 – GoldBishop

+0

你的意思是表中的每一列都是一个varchar列,或者你只想检查一下varchar列吗?我不认为XQuery版本更快。更快输入yes。执行速度并不快。也许你应该看看动态地创建where子句,以便你的代码可以重复使用多个表? –

+0

最好只检查varchar字段。但是,如果值类型不符合字符串,将不会空()返回NULL而不是0或1。 – GoldBishop

相关问题