【问题标题】:Check if any field has empty value in a table检查表中是否有任何字段具有空值
【发布时间】:2014-09-17 08:58:12
【问题描述】:

我最近,大约 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,但由于我没有接受过 TSql 的 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 指令。

【问题讨论】:

    标签: tsql sql-server-2012 xquery


    【解决方案1】:

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

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

    【讨论】:

    • 我需要搜索的列是 VarChar 字段。事实是 XQuery 会快很多,因为有些表只有 7 个字段,而另一些表则有 50 多个字段。因此,我需要“相对”轻松地遍历各种表,然后找出哪些表中有 Empty 值,这样我就知道将哪些转换为 NULL。
    • 你的意思是表中的每一列都是一个varchar列还是你只想检查varchar列?而且我不认为 XQuery 版本更快。更快地键入是。执行起来并不快。或许您应该考虑动态创建 where 子句,以便您的代码可以重复用于多个表?
    • 最好只检查 varchar 字段。但是如果值类型不符合字符串,empty() 不会返回 NULL 而不是 0 或 1?
    • 对于 xml 路径将行转换为 XML,从那里每一列都是 XML 的字符串。没有 xsd 可以在 XML 中键入节点。
    • 稍后我将使用 XQuery 来尝试一下。它可能会起作用。
    猜你喜欢
    • 2014-04-28
    • 2019-12-02
    • 2012-06-21
    • 2022-12-18
    • 2020-05-12
    • 2016-07-10
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    相关资源
    最近更新 更多